class A{
public int Avar;
public A(){
System.out.println("AAA");
doSomething();
}
public void doSomething(){
Avar=1111;
System.out.println("A.doSomething()");
}
}public class P21 extends A{
public int Pvar=2222;
public P21(){
System.out.println("BBB");
doSomething();
System.out.println("Avar="+Avar);
}
public void doSomething(){
System.out.println("Pvar="+Pvar);
}
public static void main(String[] args){
new P21();
}
}输出结果为:
AAA
Pvar=0
BBB
Pvar=2222
Avar=0
不懂这个输出顺序
还有为什么Pvar和Avar会等于0

解决方案 »

  1.   

    这个顺序是这样的:
    1。默认的初始化
    2。先查找父类,如果有父类则调用父类的构造函数
    3。看是否有this
    4。显示的初始化
    5。自己构造函数的代码。
    1。默认初始化 Avar ,Pvar =0 
    2。有父类,执行父类的构造函数输出 AAA
    3。子类覆盖了父类的doSomething方法,所以输出 Pvar=0
    4。显示的初始化 Pvar=2222
    5。自己的构造函数的代码 
    BBB
    Pvar=2222
    Avar=0  子类并没有执行父类的 doSomething方法,因为被覆盖了,所以是 0
      

  2.   

    首先调用父类A的构造函数public A(){} output AAA
    在调用doSomething();时因为是public继承并且自己也有同名函数,即调用自身的doSomething();但是进入此时只是在运行父类所以Pvar并未附值!
    主要去查看三种继承的概念,即会明白!