class A {
int a = f(); /*
A() {
System.out.println("A-constructor");
}
*/
int f() {
System.out.println("A-f()");
return 1;
}
}class B extends A {
int b = a; /*
B() {
System.out.println("B-constructor");
}
*/
int f() {
//System.out.println("B-f()");
return 2;
}
}public class ManyClass {
public static void main(String[] args) {
B b = new B();
System.out.println(b.b);
}
}为啥这代码结果是2- -  不明白

解决方案 »

  1.   

    父类的f已经被重写了 所以父类 a = f()的时候a的值是2;
      

  2.   


    如果要使构造器的初始化顺序影响输出结果
    那你就要在构造器中输出静态变量或初始化块中的语句或变量这问题不涉及构造器的初始化顺序问题
    是类之间结构问题 楼上已经回答了 LZ不要学晕了当System.out.println(b.b);时A和B已经随着B的实例化而初始化了
    即你把代码中注释去掉后无需System.out.println(b.b);
    即可输出
    A-constructor
    B-constructor
    其实仅仅从根据述情况就会发现 System.out.println(b.b);与初始化顺序无关了
      

  3.   

    难道不是子类中的b=a     而父类中的a=f()  而且父类先初始化  所以父类的a就变成了1
    然后子类的b=a=1       不是这样吗?
      

  4.   

    难道这是传说中的动态绑定?  我刚把实例变量类型改为了 A   即 A b = new B();
    结果输出的还是2     莫非它是先判断出了子类覆盖了f()方法   所以实例化时连父类中的a = f() 也调用的是子类对象的实际类型的f()方法
      

  5.   

    int a = f();
    这里的F是对象的f(),可以理解成this.f(),所以就是B类的f(),我的理解,不对还请高手指出来。。