回 帖 发 新 帖 刷新版面

主题:[求助]输出的结果怎么回事?初始化顺序?

class Egg2
{
    protected class Yolk
    {
        public Yolk(){System.out.println("Egg2.Yolk");}
        public void f(){System.out.println("Egg2.Yolk.f()");}
    }
    private Yolk y = new Yolk();
    public Egg2(){System.out.println("New Egg2()");}
    public void insertYolk(Yolk yy){y = yy;}
    public void g(){y.f();}
}

public class BigEgg2 extends Egg2 
{
    public class Yolk extends Egg2.Yolk
    {
        public Yolk(){System.out.println("BigEgg2.Yolk()");}
        public void f(){System.out.println("BigEgg2.Yolk.f()");}
    }
    public BigEgg2(){insertYolk(new Yolk());}
    public static void main(String[] args) 
    {
        Egg2 e2 = new BigEgg2();
        e2.g();
    }
}



输出:
Egg2.Yolk
New Egg2()
Egg2.Yolk
BigEgg2.Yolk()
BigEgg2.Yolk().f()

回复列表 (共1个回复)

沙发

必须明确下面两点:
1.Java类在初始化的时候,会先初始化其成员,然后才初始化自身的构造方法;
 (这点和C++有所不同)
2.先初始化父类,再初始化子类。

从主方法开始运行:
1.“Egg2 e2 = new BigEgg2()”=“ BigEgg2 e2 = new BigEgg2()”。 BigEgg2继承Egg2,所以先初始化Egg2,其中有Yolk类,于是先初始化它。输出“Egg2.Yolk
New Egg2()”
2.再初始化BigEgg2。过程参考上面。
3.“e2.g();”Egg2中g()-->BigEgg2中Yolk.f()-->...

我来回复

您尚未登录,请登录后再回复。点此登录或注册