为啥第一个输出是0啊,迷惑啊

为啥第一个输出是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