java内部类可以包围吗
若建设一个内部类,然后从封装类担任,并从头界说内部类,那么会呈现什么环境呢?也就是说,我们有大概包围一个内部类吗?这看起来好像是一个很是有用的观念,但“包围”一个内部类——好象它是外部类的另一个要领——这一观念实际不能做任何工作:
//: BigEgg.java // An inner class cannot be overriden // like a method class Egg { protected class Yolk { public Yolk() { System.out.println("Egg.Yolk()"); } } private Yolk y; public Egg() { System.out.println("New Egg()"); y = new Yolk(); } } public class BigEgg extends Egg { public class Yolk { public Yolk() { System.out.println("BigEgg.Yolk()"); } } public static void main(String[] args) { new BigEgg(); } } ///:~
默认构建器是由编译器自动合成的,并且会挪用基本类的默认构建器。各人或者会认为由于筹备建设一个BigEgg,所以会利用Yolk的“被包围”版本。但实际环境并非如此。输出如下:
New Egg()
Egg.Yolk()
这个例子简朴地展现出当我们从外部类担任的时候,没有任何特另外内部类继承下去。然而,仍然有大概“明晰”地从内部类担任:
//: BigEgg2.java // Proper inheritance of an inner class 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(); } } ///:~
此刻,BigEgg2.Yolk明晰地扩展了Egg2.Yolk,并且包围了它的要领。要领insertYolk()答允BigEgg2将它本身的某个Yolk工具上溯造型至Egg2的y句柄。所以当g()挪用y.f()的时候,就会利用f()被包围版本。输出功效如下:
Egg2.Yolk()
New Egg2()
Egg2.Yolk()
BigEgg2.Yolk()
BigEgg2.Yolk.f()
对Egg2.Yolk()的第二个挪用是BigEgg2.Yolk构建器的基本类构建器挪用。挪用
g()的时候,可发明利用的是f()的被包围版本。