返回信息流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()
对程序进入主入口main前后的成员变量,方法的初始化顺序搞不太清楚,有大牛简单指点下吗?
这是一条镜像帖。来源:北邮人论坛 / java / #17203同步于 2011/2/13
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
请大牛指点下新手
didotee
2011/2/13镜像同步3 回复
订阅后,新回复会通过你的通知中心匿名送达。
3 条回复
这个问题在java 编程思想当中有写过 , 可以去查一下 ~
简单的过程是这样的(不包括静态static代码): 1.父类的字段初始化 2.父类的构造器方法 3.子类的字段初始化 4.子类的构造器方法
所以按照上述流程,输出结果可以这样解释
输出结果:
Egg2.Yolk() // 父类中字段“y”初始化
New Egg2() // 父类构造方法
Egg2.Yolk() // 由于子类没有字段,直接调用子类构造方法。但是其中有代码new Yolk(),初始化顺序还是按照之前1-4的流程。具体如下:1.调用Yolk父类Egg2.Yolk的构造方法,输出上这行代码。
BigEgg2.Yolk() // 接上 ,2.调用子类Yolk的构造方法,输出这行代码
BigEgg2.Yolk.f() // 这行是最终方法调用的结果
【 在 Rodman 的大作中提到: 】
: 这个问题在java 编程思想当中有写过 , 可以去查一下 ~
: 简单的过程是这样的(不包括静态static代码): 1.父类的字段初始化 2.父类的构造器方法 3.子类的字段初始化 4.子类的构造器方法
: 所以按照上述流程,输出结果可以这样解释
: ...................
多谢!