结构 1 2 3 4 5 6 7 8 class OutClass { class InnerClass { } }
从上可知,内部类的实现很简单,就是将类的定义放在另一个类中,即:place a class definition within another class definition
使用 .this 和 .new
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 public class Test { public void play () { System.out.println("Test play" ); } private class Selector { public Test getTest () { return Test.this ; } } public static void main (String[] args) { Test.Selector selector1 = test.selector(); selector1.getTest().play(); } } Test play
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 public class Test { private class Selector { public void play () { System.out.println("Test playdd" ); } } public static void main (String[] args) { Test test1 = new Test(10 ); Test.Selector selector2 = test1.new Selector(); selector2.play(); } } Test playdd
内部类注意事项
必须由外部类对象创建内部类,除非是静态内部类(即嵌套类)。
It’s not possible to create an object of the inner class unless you already have an object of the outer class
内部类不能声明静态方法。
内部类可以访问外部类的所有元素。
The inner class secretly captures a reference to the particular object of the enclosing class that was responsible for creating it
可以通过分析以下代码得知:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 public class Test { private String[] iterms; private int next = 0 ; public Test (int size) { iterms = new String[size]; } public void add (String iterm) { if (next < iterms.length) iterms[next++] = iterm; } private class Selector { private int i = 0 ; public boolean end () { return i == iterms.length; } } }
编译后的class文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 public class Test { private String[] iterms; private int next = 0 ; public Test (int size) { this .iterms = new String[size]; } public void add (String iterm) { if (this .next < this .iterms.length) { this .iterms[(this .next++)] = iterm; } } private class Selector { private int i = 0 ; private Selector () {} public boolean end () { return this .i == Test.this .iterms.length; } } }
继承内部类
1 2 3 4 5 6 7 8 9 package com.houlong.java.innnerclass;class WithInner { class Inner { public void deplay () { System.out.println("hah" ); } } }
继承上述内部类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 package com.houlong.java.innnerclass;public class InheritInner extends WithInner .Inner { public InheritInner (WithInner withInner) { withInner.super (); } public static void main (String[] args) { WithInner withInner = new WithInner(); InheritInner inheritInner = new InheritInner(withInner); inheritInner.deplay(); } } hah
其中使用InheritInner类的默认构造器是不行的,会报错:
1 No enclosing instance of type 'com.houlong.java.innerclass.WithInner' is in scope
必须在构造器中加上
1 enclosingClassReference.super ();
1 2 3 4 5 6 7 8 9 10 11 12 13 class WithInner { public WithInner () { System.out.println("WithInner" ); new Inner(); } class Inner { public Inner () { System.out.println("WithInner.Inner" ); } } }
继承类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public class InheritInner extends WithInner { class Inner { public Inner () { System.out.println("InheritInner.Inner" ); } } public static void main (String[] args) { new InheritInner(); } } WithInner WithInner.Inner
可见,在父类WithInner的构造函数中调用的内部类Inner为其本身内部类,而不是子类中的。
如果想要实现override功能,代码如下:
1 2 3 4 5 6 7 8 9 10 class WithInner { private Inner inner; class Inner { public Inner () { System.out.println("WithInner.Inner" ); } } public void insertYolk (Inner yy) { } }
继承类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 public class InheritInner extends WithInner { public InheritInner () { insertYolk(new Inner()); } class Inner extends WithInner .Inner { public Inner () { System.out.println("InheritInner.Inner" ); } } public static void main (String[] args) { new InheritInner(); } } WithInner.Inner InheritInner.Inner