new B()后,会先给父类的变量赋值,即a=10,然后调用父类的构造方法A(),A()里面调用子类B的show()方法,因为B重写了show()方法而且实际对象是B嘛(如果new A()的话,才是调用A的show()方法),A()里面调用子类B的show()方法的时候,还没轮到B的属性赋值,只有加载B的时候赋了a初值0,所以这时打印0了;接下来就是对B类的属性赋值,即这时B类的a的值会是20了,调用B的构造方法B(),然后show(),这时就会打印出20了。不明白的同学可以先去百度一下“类的执行顺序”
第一次直接运行A中构造函数,然后new B();再执行B?
类B继承A重写了show方法,所以初始化父类A的时候调用的show应该是重写后的show
个人理解不知道对不对
1:super();
2:构造函数中代码;
3:字段的初始化表达式。
1>函数从 main 方法执行
2>加载 class文件,加载的同时,还会初始化 静态成员变量(这个题目中没有)
3>从main方法的 ,第一条语句执行
new B(); B有父类A,执行A的构造函数( 执行构造函数之前,会先初始化 A中的 非静态 成员变量,静态成员变量已经在加载class文件的时候初始化过了),之后,执行B的构造函数( 执行构造函数之前,会先初始化 A中的 非静态 成员变量,静态成员变量已经在加载class文件的时候初始化过了),所以,正常来讲 ,打印出来的应该是 10 20。
但是实际情况确实 0 20
原因是 父类中的 show()方法被子类覆盖,父类构造方法中调用的 show()方法不再是父类中的show()方法,而是子类中的show()方法,此时子类中的成员变量a还没有初始化,所以打印的是 0。之后再执行子类的构造函数,调用 子类自身的show, 打印的值是20(这个时候 子类的 a 已经初始化过了)