关于含有构建器调用顺序的一个问题,请指点一下小弟(有点长)

hnnywwj 2003-08-23 12:15:20
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 Eggg2(){
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 BigEgg2(){insertYolk(new Yolk());}//23,去掉这一行
public static void main(String[] args){
Egg2 e2=new BigEgg2();
e2.g();
}
}
输出结果为:Egg2.Yolk()
new Egg2()
Egg2.Yolk()
BigEgg2.Yolk()
BigEgg2.Yolk.f()
所以我自己总结的构建器调用顺序为:1、基类内部类的构建器的调用。2、基类构建器的调用。3、基类成员初始化。4、衍生类内部类的构建器的调用。5、衍生类构建器的调用。
问题在这里:当我把//23行变为注释,也就是让BigEgg2采用默认构建器的时候,输出结果为:Egg2.Yolk()
new Egg2()
Egg2.Yolk.f()

我的问题是:如果采用衍生类的默认构建器,是不是就意味着构建器调用顺序中从第3步开始就不再往下面继续了么?
ps:这个程序本身没有任何意义,小弟只是刚学java,想弄清楚一些基本的语法。
...全文
27 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhirenshao 2003-08-24
  • 打赏
  • 举报
回复
当去掉第23行后,使用默认的子类构造函数,这时候程序的顺序为:

1 初始化父类
2 初始化子类
3 调用e2.g()

初始化父类的过程:
1.1 初始化所有变量 -> 在初始化 private Yolk y=new Yolk() 的时候打印出
Egg2.Yolk()
1.2 父类构造函数被调用 -> 打印出 new Egg2()

由于子类没有变量,而且使用默认构造函数,所以“初始化子类”本身什么事都没做

最后调用 e2.g() 的时候打印出 Egg2.Yolk.f()

其实第二中情况很简单的,根本没有涉及到内部类的问题。相反第一种情况倒是很复杂的

第一种情况的第二行虽然和第二种情况是一样的,都是new Egg2(),但经历的过程是不一样的,这点需要注意,不要被迷惑了。
hnnywwj 2003-08-24
  • 打赏
  • 举报
回复
首先谢谢你的帮助
但是我还是没明白,因为按我上面总结的那个构件器的调用顺序
,子类中内部类的构件器会调用的啊,
至少应该输出一个BegEgg2.Yolk()啊,
难道是我总结的调用顺序不正确么?
idilent 2003-08-23
  • 打赏
  • 举报
回复
因为你在子类中根本就没有把内部类事例化。也就是说,子类中根本没有Yolk对象,怎么回调用Yolk的构造函数呢?

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧