日期:2014-05-20  浏览次数:20599 次

构造器的初始化顺序问题(这代码为什么这样)
Java code

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- - 不明白。。。

------解决方案--------------------
实例化子类对象时会预先创建一个父类对象,而这里的子类重写了父类对象的f()方法,
我想楼主主要是后面这里没有搞懂吧。你要注意父类的方法已经被重写了。

------解决方案--------------------

如果要使构造器的初始化顺序影响输出结果
那你就要在构造器中输出静态变量或初始化块中的语句或变量

这问题不涉及构造器的初始化顺序问题
是类之间结构问题 楼上已经回答了 LZ不要学晕了

当System.out.println(b.b);时A和B已经随着B的实例化而初始化了
即你把代码中注释去掉后无需System.out.println(b.b);
即可输出
A-constructor
B-constructor
其实仅仅从根据述情况就会发现 System.out.println(b.b);与初始化顺序无关了