以上代码的执行结果是什么?
son.x=0 son.x=30 20成员变量的赋值过程: 1⃣️ 默认初始化 -> 2⃣️ 显示初始化/代码块中初始化 -> 3⃣️ 构造器初始化 -> 4⃣️ 有了对象之后,可以通过"对象.属性""对象.方法"的方式对成员变量赋值
来看看初始化一个简单对象
public class Father { int x = 10; public Father() { this.print(); x=20; } public void print(){ System.out.println("father.x="+x); } } public static void main(String[] args) { Father father = new Father(); System.out.println(father.x); } //father.x=10 //20看看构造器的字节码
0 aload_0 1 invokespecial #1 <java/lang/Object.<init>>//super操作调用父类的构造函数 4 aload_0 5 bipush 10 7 putfield #2 <com/study/jvmpro/load/Father.x>//把x赋为10 10 aload_0 11 invokevirtual #3 <com/study/jvmpro/load/Father.print>//调用print方法 14 aload_0 15 bipush 20//把x赋值为20 17 putfield #2 <com/study/jvmpro/load/Father.x> 20 return再看看开篇的题目 看看son的构造函数字节码
0 aload_0 1 invokespecial #1 <com/study/jvmpro/load/Father.<init>>//father的构造函数,具体参考上面讲的son的构造函数 //这里有一点注意,父类构造函数调用this.print的时候,因为this指向是子类对象,所以调用的是子类的print()方法,而且这个时候x还没有赋值,只是初始值,所以打印出来是0 4 aload_0 5 bipush 30 //显示赋值为30 7 putfield #2 <com/study/jvmpro/load/Son.x> 10 aload_0 11 invokevirtual #3 <com/study/jvmpro/load/Son.print> 14 aload_0 15 bipush 40//赋值为40 17 putfield #2 <com/study/jvmpro/load/Son.x> 20 return最后System.out.println(son.x);的时候因为属性不具有多态性,所以打印的是父类的属性的值