java内部类继承问题?

ruanwxh 2008-11-20 04:45:14
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();
}
}

程序结果为:---------- java ----------
Egg2.Yolk()
New Egg2()
Egg2.Yolk()
BigEgg2.Yolk()
BigEgg2.Yolk.f()

请大大讲解下为什么是这种结果?
...全文
82 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhoushaolan 2008-11-20
  • 打赏
  • 举报
回复
子类的引用可以指向他的父类。
子类在实例的时候总是先调用父类的构造方法。
再调用子类的构造方法。
用子类引用的对象,调用成员方法,会覆盖父类的成员方法。
ruanwxh 2008-11-20
  • 打赏
  • 举报
回复
多谢啊,但是private Yolk y = new Yolk(); //构造父类实例时,先初始化成员变量 Yolk
//所以这里的 new Yolk();构造时调用了 Yolk类的构造方法,第 3 步打印出                   //  来就是 "Egg2.Yolk()",
这是第1步还是第3步吗?可以讲再详细吗?
lshy168 2008-11-20
  • 打赏
  • 举报
回复

class Egg2 {
private Yolk y = new Yolk(); //构造父类实例时,先初始化成员变量 Yolk
//所以这里的 new Yolk();构造时调用了 Yolk类的构造方法,第 3 步打印出来就是 "Egg2.Yolk()", 构造父类完后.接着构造子类

// 构造方法
public Egg2() { //进入构造方法 , 第 2 步 打印出来就是 "New Egg2()"
System.out.println("New Egg2()");// 2
}

public void insertYolk(Yolk yy) {
y = yy;
}

public void g() {
y.f(); //调用了 Yolk.f()
}

//构造父类实例时,要初始化成员变量,所以这里也要初始化。所以第 1 步打印了 "Egg2.Yolk()"。
protected class Yolk {
// 构造方法
public Yolk() {
System.out.println("Egg2.Yolk()");// 1,3
}

public void f() {
System.out.println("Egg2.Yolk.f()");
}
}
}

public class BigEgg2 extends Egg2 {
// 构造方法
public BigEgg2() {
insertYolk(new Yolk());
}

public class Yolk extends Egg2.Yolk {
public Yolk() {
System.out.println("BigEgg2.Yolk()"); // 4
}

public void f() {
System.out.println("BigEgg2.Yolk.f()"); // 5
}
}

public static void main(String[] args) {
//构造 BigEgg2 实例是先构造父类 Egg2 的实例
Egg2 e2 = new BigEgg2();
e2.g(); //构造父类完后执行这个方法。
}
}

62,616

社区成员

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

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