JAVA内部类是完全独立的实体,各自在自己的命名空间内
package cm.java.Practic10;
class Egg2 {
protected class Yolk {
public Yolk() {
System.out.println("Egg2.Yolk()");
}
public void f() {
System.out.println("Egg2.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 BigEgg2P213 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 BigEgg2P213() {
insertYolk(new Yolk());
}
public static void main(String[] args) {
Egg2 e2 = new BigEgg2P213();
e2.g();
}
}输出:
Egg2.Yolk()
New Egg2()
Egg2.Yolk()
BIgEgg2.Yolk()
BigEgg2.Yolk().f()
总结:
两个内部类是完全独立的两个实体,各自在自己的命名空间内。
过程:
Egg2 e2 = new BigEgg2P213();
实例化一个new BigEgg2P213()赋值给e2;
先看基类:静态成员,静态方法,数据成员,构造函数;
数据成员有:private Yolk y = new Yolk();
首先实例化Yolk,class Egg2中的;
protected class Yolk {
public Yolk() {
System.out.println("Egg2.Yolk()");
}
public void f() {
System.out.println("Egg2.f()");
}
}
所以输出:
Egg2.Yolk()
然后构造函数:
public Egg2() {
System.out.println("New Egg2()");
}输出:
New Egg2()
基类搞定看自己类class BigEgg2P213:
构造函数:
public BigEgg2P213() {
insertYolk(new Yolk());
}首先实例化new Yolk(),该类为class BigEgg2P213 extends Egg2中的:
public class Yolk extends Egg2.Yolk {
public Yolk() {
System.out.println("BIgEgg2.Yolk()");
}
public void f() {
System.out.println("BigEgg2.Yolk().f()");
}
}先调用基类的Yolk构造函数,再自己的
所以输出:
Egg2.Yolk()
BIgEgg2.Yolk()
然后insertYolk(new Yolk());将基类中的Yolk y=yy;
现在基类中的y已经是class BigEgg2P213中的Yolk了;
调用该函数:
public void g() {
y.f();
}实际上为
class BigEgg2P213中的Yolk的f()
输出:
BigEgg2.Yolk().f()