为啥第一个输出是0啊,迷惑啊
问题描述:
以下程序的输出结果是什么()
public class SubCls extends SuperCls {
int a = 6;
public SubCls(){
test();
}
public void test(){
System.out.println(a);}
public static void main(String[] args) {
new SubCls();
}}
class SuperCls{
int a = 8;
public SuperCls(){
test();
}
public void test(){
System.out.println(a);
}
}
答
理解一下,基类构造先调用,test调用的是子类的test,输出a,单此时子类构造尚未执行,a还是0。好吧,只能这么理解。你在两个test中在输出点别的,可以测试一下调用关系
答
1、父类的静态变量和静态块赋值(按照声明顺序)
2、自身的静态变量和静态块赋值(按照声明顺序)
3、main方法
3、父类的成员变量和块赋值(按照声明顺序)
4、父类构造器赋值
5、自身成员变量和块赋值(按照声明顺序)
6、自身构造器赋值
7、静态方法,实例方法只有在调用的时候才会去执行
在你调用时 还未赋值执行 所以时默认0
答
父类构造调用的test方法,优先用子类重写的test方法,当父类构造方法执行时,子类构造方法执行的构造方法体中首行的super(),此时,子类构造方法还有个test方法没有执行,因为子类构造没执行完,所以子类中的a还没有赋值,所以父类构造调用子类重写的test方法输出的是0。
此时,父类构造方法结束,子类会执行局部变量赋值运算,子类构造方法中还有一个test()未执行,执行test(),调用子类test方法输出为6