【我与Java的成长记】之this引用和构造方法的使用详解

这篇具有很好参考价值的文章主要介绍了【我与Java的成长记】之this引用和构造方法的使用详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【我与Java的成长记】之this引用和构造方法的使用详解,Java笔记,java,开发语言,学习,笔记,经验分享

系列文章目录

能看懂文字就能明白系列
C语言笔记传送门
🌟 个人主页:古德猫宁-

🌈 信念如阳光,照亮前行的每一步



前言

本节目标:掌握this引用,构造方法的定义及其使用

本节重点:都是重点


一、this的使用

先看一个例子:

public class Date {
    public int year;
    public int month;
    public int day;
    public void setDay(int y, int m, int d){
        year = y;
        month = m;
        day = d;
    }
    public void printDate(){
        System.out.println(year + "/" + month + "/" + day);
    }
    public static void main(String[] args) {
// 构造三个日期类型的对象 d1 d2 d3
        Date d1 = new Date();
        Date d2 = new Date();
        Date d3 = new Date();
// 对d1,d2,d3的日期设置
        d1.setDay(2020,9,15);
        d2.setDay(2020,9,16);
        d3.setDay(2020,9,17);
// 打印日期中的内容
        d1.printDate();
        d2.printDate();
        d3.printDate();
    }
}

以上代码定义了一个日期类,然后main方法中创建了三个对象,并通过Date类中的成员方法对对象进行设置和打印,代码整体逻辑非常简单,应该没有任何问题。

但是细思之下有以下两个疑问:

  1. 形参名不小心与成员变量相同:
public void setDay(int year, int month, int day){
year = year;
month = month;
day = day;
}

这样写的话我们可能就有这些疑问了:那函数体中到底是谁给谁赋值?成员变量给成员变量?参数给参数?参数给成员变量?成员变量参数?估计自己都搞不清楚了。

  1. 三个对象都在调用setDate和printDate函数,但是这两个函数中没有任何任何有关对象的说明,setDate和printDate函数如何知道打印的是哪个对象的数据呢?
    【我与Java的成长记】之this引用和构造方法的使用详解,Java笔记,java,开发语言,学习,笔记,经验分享
    接下来有请 this登场
    this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成,在后面要习惯使用this。
public class Date {
public int year;
public int month;
public int day;
public void setDay(int year, int month, int day){
this.year = year;
this.month = month;
this.day = day;
}
public void printDate(){
System.out.println(this.year + "/" + this.month + "/" + this.day);
}
}
public static void main(String[] args) {
Date d = new Date();
d.setDay(2023,12,28);
d.printDate();
}

注意:this引用的是调用成员方法的对象
【我与Java的成长记】之this引用和构造方法的使用详解,Java笔记,java,开发语言,学习,笔记,经验分享

this引用的特性

  1. this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型
  2. this只能在成员方法中使用
  3. 在成员方法中,this只能引用当前对象,不能再引用其他对象
  4. this是成员方法第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法对象的引用传递给该成员,this来负责接收(如上图所示)

二、对象的构造和初始化

成员变量和局部变量之间的差别

在Java方法内部定义一个局部变量时,局部变量必须初始化(局部变量是声明在方法中的),否则会编译失败(C语言则可以)

例如:
【我与Java的成长记】之this引用和构造方法的使用详解,Java笔记,java,开发语言,学习,笔记,经验分享
对于上述的代码,你可以声明没有值的a,但如果想要使用时,编译器就会报错,而想要上面的代码编译通过,只需要给变量a初始化即可

如图:
【我与Java的成长记】之this引用和构造方法的使用详解,Java笔记,java,开发语言,学习,笔记,经验分享

而对于成员变量,那可就不一样了,在未初始化成员变量的时候,编译器仍然可以编译运行(注意:成员变量是声明在类内而不是方法中)
【我与Java的成长记】之this引用和构造方法的使用详解,Java笔记,java,开发语言,学习,笔记,经验分享
这是为什么呢?后面会介绍哒

三、如何初始化对象

那到底如何初始化对象呢,在Java中,初始化对象的方法有很多种,且听小弟慢慢道来

就地初始化

顾名思义,在声明变量的时候就赋予变量的值,这跟初始化局部变量一样(在实际中,就地初始化其实比较少,除非有特殊业务需求,比如任何一次对象的实例化之后,都期望这个对象叫dada,年龄为20)
【我与Java的成长记】之this引用和构造方法的使用详解,Java笔记,java,开发语言,学习,笔记,经验分享

当然我们也可以借助方法来帮助我们完成初始化
【我与Java的成长记】之this引用和构造方法的使用详解,Java笔记,java,开发语言,学习,笔记,经验分享
【我与Java的成长记】之this引用和构造方法的使用详解,Java笔记,java,开发语言,学习,笔记,经验分享

通过构造方法初始化

构造方法(也称构造器)是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的生命周期只调用一次(构造方法也是定义在类内)

如图是一个带两个参数的构造方法:
【我与Java的成长记】之this引用和构造方法的使用详解,Java笔记,java,开发语言,学习,笔记,经验分享
如图是一个不带参数的构造方法:
【我与Java的成长记】之this引用和构造方法的使用详解,Java笔记,java,开发语言,学习,笔记,经验分享
上述的两个构造方法,名字相同,参数列表不同,因此构成了方法重载。

特别注意的是:构造方法的作用就是对对象中的成员进行初始化,并不负责给对象开辟空间。

构造方法的特性

  1. 名字必须和类名相同
  2. 没有返回值类型,设置为void也不行
  3. 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次
  4. 构造方法可以重载(用户可以根据自己的需求提供不同参数的构造方法)

重点:
如果我们没有自己定义任何一个构造方法,编译器会生成一份默认的构造方法,生成的默认构造方法一定是无参的。

它长这样:
【我与Java的成长记】之this引用和构造方法的使用详解,Java笔记,java,开发语言,学习,笔记,经验分享
但是!!!!!!!
如果我们一旦写了任何一个构造方法的时候,Java就不会提供这个默认的构造方法了(救急不救穷)什么意思呢?
【我与Java的成长记】之this引用和构造方法的使用详解,Java笔记,java,开发语言,学习,笔记,经验分享
在上面的代码中,我们自己定义了一个构造方法,那么Java就不会提供一个无参的构造方法了,我们需要把参数传递给构造方法才不会报错

如图:
【我与Java的成长记】之this引用和构造方法的使用详解,Java笔记,java,开发语言,学习,笔记,经验分享

构造方法的调用

那在程序中,这些构造方法是什么时候被调用的呢?

我们用代码来检验一下
【我与Java的成长记】之this引用和构造方法的使用详解,Java笔记,java,开发语言,学习,笔记,经验分享
如图所示,只有在实例化对象的时候才被调用且在整个对象的生命周期内只调用一次。

在构造方法中,可以通过this调用其他构造方法来简化代码(注意是在构造方法中才可以)
【我与Java的成长记】之this引用和构造方法的使用详解,Java笔记,java,开发语言,学习,笔记,经验分享
在上面的代码中,可以在无参数构造方法中通过this调用带有两个参数的构造方法给成员变量初始值,特别注意的是,this(“zhangsan”,18)必须是构造 方法中的第一条语句,否则编译器会报错。

如图所示:
【我与Java的成长记】之this引用和构造方法的使用详解,Java笔记,java,开发语言,学习,笔记,经验分享

四、默认初始化

在开头我们讲述了局部变量和成员变量的差别,那为什么局部变量在使用时必须要初始化,而成员变量可以不用呢?
要搞清楚这个情况,就需要知道 new 关键字背后所发生的一些事情:

在程序层面只是简单的一条语句,在JVM层面需要做好多事情,下面简单介绍下:文章来源地址https://www.toymoban.com/news/detail-764272.html

  1. 检测对象对应的类是否加载了,如果没有加载则加载
  2. 为对象分配内存空间
  3. 处理并发安全问题,比如:多个线程同时申请对象,JVM要保证给对象分配的空间不冲突
  4. 初始化所分配的空间,即:对象空间被申请之后,对象中包含的成员已经设置好了初始值,比如:
数据类型 默认值
byte 0
char ‘\u0000’
short 0
int 0
long 0L
boolean false
float 0.0f
double 0.0
reference null

  1. 设置对象头信息(关于对象内存模型后面会介绍)
  2. 调用构造方法,给对象中各个成员赋值

到了这里,关于【我与Java的成长记】之this引用和构造方法的使用详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Java基础教程】(七)面向对象篇 · 第一讲:上干货!面向对象的特性、类与对象、内存结构引用分析、垃圾收集器 GC处理、封装性详解、构造方法、匿名对象、简单 Java 类~

    程序是将数据和逻辑封装在一起的代码段。在Java中,方法是常用的代码段封装方式。然而,在Java中,方法必须存在于一个类中才能使用。因此,我们将进入本章的核心内容——面向对象编程。 利用面向对象设计的程序可以实现代码的重用,并方便开发者进行项目维护。面向

    2024年02月13日
    浏览(44)
  • Java中的方法引用--【基本使用详解】

    🎉博客首页:痛而不言笑而不语的浅伤 📢欢迎关注🥳点赞 👍 收藏 ⭐留言 📝 欢迎讨论! 🔮本文由痛而不言笑而不语的浅伤原创,CSDN首发! 🌋系列专栏:《JavaSE系列详解》 🧿首发时间:2022年5月27日 ❤:热爱Java学习,期待一起交流! 🙏🏻作者水平有限,如果发现错

    2024年02月06日
    浏览(48)
  • 全面理解java中的构造方法以及this关键字的用法(超详细)

    Hello,各位铁汁们!我是小🐟儿哈!今天我又来更新我的Java基础学习博客了。 本篇主要内容概述: 1、🍚如何用构造方法初始化对象 2、🍚为啥要有this这个 3、🍚this.属性名访问成员变量、成员方法 4、🍚this.方法名 || this.()的用法 目录 初识构造方法  构造方法的使

    2023年04月09日
    浏览(62)
  • 我在VScode学Java继承(Java继承的特点、super关键字、super和this对比、方法重写、子类构造器)贰

    类的成员包括:成员变量;成员方法;构造方法 构造方法:不管什么修饰符都不可继承 成员变量:都可以继承,但注意一点(继承!=调用,私有的就不可调用) 成员方法:非私有可以。私有不可。 我的个人博客主页:如果’\\\'真能转义1️⃣说1️⃣的博客主页 关于Java基本语

    2024年02月14日
    浏览(55)
  • 详解JAVA中的构造方法

    目录 一、构造方法的概念 二、构造方法的特 性         构造方法(也称为构造器)是一个特殊的成员方法, 名字必须与类名相同,在创建对象时由编译器自动调用,并且在整个对象的生命周期内只调用一次。 代码演示: 运行结果 : 注意:           构造方法的作

    2023年04月08日
    浏览(47)
  • 【Java 干货教程】Java方法引用详解

    导言 Java方法引用是Java 8引入的一项重要特性,它提供了一种简洁、可读性高的方式来直接引用已经存在的方法。方法引用使得代码更加简洁、易懂,同时提高了代码的可维护性和重用性。本文将详细介绍Java方法引用的概念、语法和使用方法,并提供一些示例代码。 方法引用

    2024年02月01日
    浏览(37)
  • 【Java 基础篇】Java方法引用详解

    Java方法引用是Java 8引入的一项重要特性,它提供了一种简洁、可读性高的方式来直接引用已经存在的方法。方法引用使得代码更加简洁、易懂,同时提高了代码的可维护性和重用性。本文将详细介绍Java方法引用的概念、语法和使用方法,并提供一些示例代码。 方法引用是一

    2024年02月12日
    浏览(37)
  • Java 8新特性:方法引用的介绍与使用

    🎉🎉🎉 点进来你就是我的人了 博主主页: 🙈🙈🙈 戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔 🤺🤺🤺 目录 1. 什么是方法引用? 2. 方法引用的类型 3. 如何使用方法引用? 3.1 静态方法引用 (类名::静态方法) 3.2 特定对象的实例方法引用 (对象::方法名) 3.3 特定

    2024年02月10日
    浏览(42)
  • uniapp 组件引用 TypeError: this.$refs.xxx is not a function 解决方法(全)

    因为自己的项目中,某些常用模块自己定义了组件,使用时 常出现 TypeError: this.$refs.xxx is not a function (即没有xxx这个方法),结合网友和自身遇到的问题,得出三种方法 第一种:引用注册  即 在页面中 import 组件。  解决方法:查看是否组件引用正确。 第二种:组件在循环

    2024年02月11日
    浏览(47)
  • 『C++成长记』拷贝构造函数

     🔥 博客主页: 小王又困了 📚 系列专栏: C++ 🌟 人之为学,不日近则日退 ❤️ 感谢大家点赞👍收藏⭐评论✍️ 目录 一、拷贝构造函数 📒1.1拷贝构造函数的概念 📒1.2拷贝构造函数的写法 📒1.3编译器生成的拷贝构造 📒1.4拷贝构造函数的用法 📒1.5拷贝构造函数典型调

    2024年02月04日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包