下面的代码非常简单,一时想不通的地方是,输出的结果:我觉得输出结果是
New Egg2()
Egg2.Yolk()
BigEgg2.Yolk()
BigEgg2.Yolk.f()
为什么下面的输出,会先输出个Egg2.Yolk()??
import static net.mindview.util.Print.*;class Egg2 {
protected class Yolk {
public Yolk() { print("Egg2.Yolk()"); }
public void f() { print("Egg2.Yolk.f()");}
}
private Yolk y = new Yolk();
public Egg2() { print("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() { print("BigEgg2.Yolk()"); }
public void f() { print("BigEgg2.Yolk.f()"); }
}
public BigEgg2() { insertYolk(new Yolk()); }
public static void main(String[] args) {
Egg2 e2 = new BigEgg2();
e2.g();
}
} /* Output:
Egg2.Yolk()
New Egg2()
Egg2.Yolk()
BigEgg2.Yolk()
BigEgg2.Yolk.f()
*///:~
New Egg2()
Egg2.Yolk()
BigEgg2.Yolk()
BigEgg2.Yolk.f()
为什么下面的输出,会先输出个Egg2.Yolk()??
import static net.mindview.util.Print.*;class Egg2 {
protected class Yolk {
public Yolk() { print("Egg2.Yolk()"); }
public void f() { print("Egg2.Yolk.f()");}
}
private Yolk y = new Yolk();
public Egg2() { print("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() { print("BigEgg2.Yolk()"); }
public void f() { print("BigEgg2.Yolk.f()"); }
}
public BigEgg2() { insertYolk(new Yolk()); }
public static void main(String[] args) {
Egg2 e2 = new BigEgg2();
e2.g();
}
} /* Output:
Egg2.Yolk()
New Egg2()
Egg2.Yolk()
BigEgg2.Yolk()
BigEgg2.Yolk.f()
*///:~
楼主【llm0528】截止到2008-07-29 22:23:30的历史汇总数据(不包括此帖):
发帖的总数量:66 发帖的总分数:1450 每贴平均分数:21
回帖的总数量:60 得分贴总数量:0 回帖的得分率:0%
结贴的总数量:66 结贴的总分数:1450
无满意结贴数:0 无满意结贴分:0
未结的帖子数:0 未结的总分数:0
结贴的百分比:100.00% 结分的百分比:100.00%
无满意结贴率:0.00 % 无满意结分率:0.00 %
敬礼!
取消马甲机器人,请点这里:http://www.java2000.net/mycsdn/robotStop.jsp?usern=llm0528
你把这里的print("Egg2.Yolk()");去掉就和你想要的一样了
先初始化属性
Egg2.Yolk()
New Egg2()
Egg2.Yolk()
BigEgg2.Yolk()
BigEgg2.Yolk.f()
看这句:
Egg2 e2 = new BigEgg2();
要创建BigEgg2的对象,构造该构造方法之前需要先调用其父类的构造方法Egg2 e2 = new BigEgg2();
在调用父类的构造方法之前父类中有一个变量需要初始化: private Yolk y = new Yolk();这时需要调用York的构造方法,public Yolk() { print("Egg2.Yolk()"); },所以首先输出Egg2.Yolk()
然后调用父类的构造方法,输出New Egg2(),然后调用子类的构造方法public BigEgg2() { insertYolk(new Yolk()); }
进入该方法,看new Yolk(),先调用Yolk父类的构造方法,public Yolk() { print("Egg2.Yolk()"); },输出Egg2.Yolk(),然后调用子类的构造方法
public Yolk() { print("BigEgg2.Yolk()"); },输出BigEgg2.Yolk(),这样才完成了对象的创建.
下面执行
e2.g();
多态,输出BigEgg2.Yolk.f()
结束
private Yolk y = new Yolk();
在构造方法之前执行.
private Yolk y = new Yolk();实例化对象的同时首先会先调用构造方法,然后执行其他。