恳请各位高手讲解一下,这个程序为什么运行结果会是这个样子
class A{
public int Avar;
public A(){
System.out.println("AAA");
doSomething();
}
public void doSomething(){
Avar=1111;
System.out.println("A.doSomething()");
}
}public class B extends A{
public int Bvar=2222;
public B(){
System.out.println("BBB");
doSomething();
System.out.println("Avar="+Avar);
}
public doSomething(){
System.out.println("Bvar="+Bvar);
}
public static void main(String[] args){
new B();
}
}
运行结果为:
AAA
Bvar=0
BBB
Bvar=2222
Avar=0

解决方案 »

  1.   

    1.JAVA上溯
    2.默认初始值 
    3.初始化时间
      

  2.   

    构造来构造去而已,A的doSomething没有运行过
      

  3.   

    1。先调用基类构造函数 所以AAA
    2。dosomething 因为Bvar还没初始化 所以Bvar的默认值是0  ===》》Bvar=0
    3。初始化int Bvar=2222;
    4。B() ===》》BBB  Bvar=2222  因为A的doSomething没被调用,所以Avar=0
      

  4.   

    AAA      构造b的时候,先要初始化基类的成员,调用基类的构造函数,所以会输出“AAA”
    Bvar=0   由于基类的构造函数调用了doSomething,而B又override了doSomething,实际调用的是B 的doSomething
    BBB 然后再开始执行B()的代码,
    Bvar=2222 这时候Bvar已经初始化为2222
    Avar=0 默认初始化为0
      

  5.   

    用我这个例子吧解决你所有的问题  class A{            //根据继承关系最先被加载
    public int Avar=1111;   //进行初始化
    public A(){            //执行构造函数
    doSomething(); //执行动态绑定调用被复写的函数 第一个显示Bvar_B()=0
    System.out.println("AAA_A()");//第二个显示 
            System.out.println("Avar_A()="+Avar);//第三个显示Avar_A()=1111 }
    public void doSomething(){
    Avar=9999;
    System.out.println("A.doSomething()");
    }
    }public class B extends A{              //再开始加载类B
    public int Bvar=2222;   //初始化.......后面你就应该知道了吧,不废话了
    public B(){
    System.out.println("BBB_B()");
    System.out.println("Avar_B()="+Avar);
    doSomething();
    }
    public void doSomething(){
    System.out.println("Bvar_B()="+Bvar);
    }
    public static void main(String[] args){
    new B();
    }
    }
      

  6.   

    那为什么Bvar在第二步的时候会是零啊,还有Avar,就是最后一步也是零啊
      

  7.   

    public doSomething(){
    System.out.println("Bvar="+Bvar);
    }
    这个方法是不是有问题?没有返回类型,又不是构造器!
      

  8.   

    大家的热情讲解使小弟收益非浅,在此谢过各位.
    我还想请教一下,为什么class A中的doSomething()被override(越过)了,没有被执行
      

  9.   

    class A{            //构造函数B()会根据继承关系最先被加载
    public int Avar=1111;   //由于A类的加载引起它的字段的初始化
    public A(){            //由于函数B()会根据继承关系会继承并执行构造函数A()
    doSomething(); //虽然是A()的函数但是根据执行动态绑定执行的是被类B复写的
                                     //函数所以第一个显示Bvar_B()=0(因为B类还没有初始化
                                     //                              所以Bvar_B()=0)
    System.out.println("AAA_A()");//继续执行,第二个显示 
            System.out.println("Avar_A()="+Avar);//继续执行第三个显示Avar_A()=1111,
                                                 //A()构造函数执行完毕,执行B()构造函数 }
    public void doSomething(){
    Avar=9999;
    System.out.println("A.doSomething()");
    }
    }public class B extends A{              //再开始加载类B
    public int Bvar=2222;   //初始化.......后面你就应该知道了吧,不废话了
    public B(){
    System.out.println("BBB_B()");
    System.out.println("Avar_B()="+Avar);
    doSomething();
    }
    public void doSomething(){
    System.out.println("Bvar_B()="+Bvar);
    }
    public static void main(String[] args){
    new B();
    }
    }产生的是 new B();调用的方法也跟B挂钩,就不会执行A的方法....动态绑定
    楼主,可以结贴了吧