标签:重复 private 对象 class 之间 pre mic public com
this关键字代指当前对象,可在方法中区分全局变量和局部变量
public class ThisTest {
private int age;
public ThisTest(){
System.out.println("我是空参");
}
public ThisTest(int age){
this.age = age;
System.out.println("我是实参");
}
}
this关键字除了可以区分变量,还可以在构造函数中被调用,减少构造函数中重复的代码
public class ThisTest {
private int age;
public ThisTest(){
System.out.println("我是空参");
}
public ThisTest(int age){
//调用空参构造函数
this();
this.age = age;
System.out.println("我是实参");
}
public static void main(String[] args) {
new ThisTest(12); //先打印‘我是空参‘,再打印‘我是实参‘
}
}
在类加载的过程中,会生成两个方法,一个是clinit()
方法,用来初始化静态变量;另一个是init()
方法,在new 对象的时候被调用,默认是空参构造函数,那么,如果有多个构造函数,并且又面临在构造函数中调用其他构造函数方法的情况,init()
方法如何生成?
还是使用ThisTest
类来验证:
public class ThisTest {
private int age;
public ThisTest(){
System.out.println("我是空参");
}
public ThisTest(int age){
this();
this.age = age;
System.out.println("我是实参");
}
public static void main(String[] args) {
new ThisTest(12);
}
}
使用jclasslib
反编译得到:
可见生成的字节码里面有两个init()
方法,所以可以得知,当Java前端编译器(也就是我们经常说的编译器)把文件进行编译后,会针对不同的构造函数生成不同的init()方法,声明了多少个构造函数就生成多少个重载的init()方法
再看反编译后的方法的调用指令:
可以看出构造方法之间的调用编译过后就是生成的init()
方法的调用!!!
标签:重复 private 对象 class 之间 pre mic public com
原文地址:https://www.cnblogs.com/muhexiong/p/14203028.html