This引用和对象的构造以及初始化
Posted ohana!
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了This引用和对象的构造以及初始化相关的知识,希望对你有一定的参考价值。
一,this引用
java编译器给每个成员方法增加了一个隐藏的引用类型参数,该参数指向当前对象(即就是成员方法运行时调用该成员方法的对象),该引用存在于所有成员方法中对成员变量的操作,对于用户来说是不需要添加的,编译器自动完成相应的操作
举个栗子:创建一个时间类
public class Date {
public int year;
public int month;
public int day;
public void setDate(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
}
public void printDate(){
System.out.println(year + "-" + month + "-" + day);
}
public static void main(String[] args) {
Date date = new Date();
date.setDate(2021,9,14);
date.printDate();
}
}
让程序以debug方式运行,从监视窗口观察
我在将隐藏的this引用添加上,发现代码并未报错,而且可以正常运行
证明确实有隐藏的this并且在对象调用方法时自动添加,在编写程序时并不需要手动添加,但即使手动添加也不影响程序
this引用的特性:
- 哪个对象调用就是哪个对象的引用类型
- “this”引用只能在‘成员方法’中使用
- 在成员方法中,只能引用当前对象,而不能引用其他对象,具有final属性
- this引用可以为空,编译可以通过,但是运行会报错
报了一个指针异常的错误(java.lang.NullPointerException)
二,对象的构造以及初始化
构造方法
构造方法也称为构造器,是一个特殊的成员方法,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次
- 名字与类名相同,没有返回值类型,即使设置为void也不行
也会正常运行
若添加void或者其他返回值类型
- 一般情况下用public来修饰
- 在创建对象时系统自动调用,并且在整个对象的生命周期内只调用一次
public Date(){ this.year = 2000; this.month = 3; this.day = 10; System.out.println(this.year + "-" + this.month + "-" + this.day); System.out.println("我是无参构造方法"); } public Date(int year, int month, int day) { this.year = year; this.month = month; this.day = day; System.out.println(this.year + "-" + this.month + "-" + this.day); System.out.println("我是含有三个参数的构造方法"); }
- 构造方法的作用就是给成员进行初始化,不负责开辟空间
- 构造方法可以重载(名字相同,参数列表不同)
在(2)中的两个构造方法就是重载
- 如果用户没有显式定义,系统会自动生成,并且一定是无参的
public class TestDate { public int year; public int month; public int day; public void printTestDate(){ System.out.println(this.year + "-" + this.month + "-" + this.day); } public static void main(String[] args) { TestDate date = new TestDate(); date.printTestDate(); } }
当用户不显式定义的时候,系统自动生成无参的构造方法
- 在构造方法中可以通过调用this来简化代码(但this引用必须是第一条语句,而且不能形成递归调用)
public class TestDate { public int year; public int month; public int day; public TestDate(){ System.out.println("我是无参构造方法!"); } public TestDate(int year, int month, int day) { this(); this.year = year; this.month = month; this.day = day; } }
如果this语句不是第一句的情况下,系统会自动报错,说,this引用必须是第一条
this成环调用的话,会报一个”递归构造器的调用“的错误
三,初始化
在Java中,当定义了一个局部变量,必须要初始化,但在之前的成员变量中,我们并没有初始化,之所以会编译通过,是因为程序背后,在JVM层面做了好多事情
默认初始化
- 检测对象对应的类是否加载
- 为对象分配内存空间
- 处理并发安全问题
- 初始化分配的空间(此时对象空间被申请好后,对象中的成员已经被设置好了初始值)比如:byte ----> 0 char ----> '\\u0000' 等等
- 设置对象头信息
- 调用构造方法给对象中的各个成员赋值
就地初始化
即就是在声明成员变量时,直接给了初始值
public int year = 2000;
public int month = 3;
public int day = 10;
以上是关于This引用和对象的构造以及初始化的主要内容,如果未能解决你的问题,请参考以下文章