1.内部类自动拥有对其外围类的所有成员的访问权限。
实际上,当某个外围类对象创建一个内部类对象时,此内部类对象自动捕获了一个指向外围类对象的引用。
内部类对象可以通过:外部类名.this 来获取外部类对象。
例子:
1 public class Outer 2 { 3 public class Inner 4 { 5 public Outer outer() 6 { 7 //生成对外部类对象的引用 8 return Outer.this; 9 } 10 } 11 12 public Inner inner() 13 { 14 return new Inner(); 15 } 16 17 public static void main(String[] args) 18 { 19 Outer o = new Outer(); 20 Outer.Inner i1 = o.inner(); 21 Outer.Inner i2 = o.inner(); 22 System.out.println(i1 == i2); 23 System.out.println(i1.outer() == i2.outer()); 24 } 25 }
运行结果:
1 false 2 true
2.通过new语法创建内部类对象
1 public class Outer 2 { 3 public class Inner{} 4 5 public static void main(String[] args) 6 { 7 Outer o = new Outer(); 8 Outer.Inner i = o.new Inner(); 9 System.out.println(o.getClass()); 10 System.out.println(i.getClass()); 11 } 12 }
运行结果:
1 class Outer 2 class Outer$Inner
所以很显然1中:System.out.println(i1.outer() == i2.outer()); 结果为true。
因为创建内部类对象需要外围类对象的引用。
3.static内部类对象并不含有外围类对象的引用,所以创建static内部类对象不需要外围类的实例。
1 public class Outer 2 { 3 public static class Inner{} 4 5 public Inner newInner() 6 { 7 return new Inner(); 8 } 9 10 public static Inner staticNewInner() 11 { 12 return new Inner(); 13 } 14 15 public static void main(String[] args) 16 { 17 Outer o = new Outer(); 18 Outer.Inner i1 = o.newInner(); 19 System.out.println(i1.getClass()); 20 Outer.Inner i2 = Outer.staticNewInner(); 21 System.out.println(i2.getClass()); 22 } 23 }
4.内部类的灵活性
一个例子体现:假如我们要实现一个sequence类,要为sequence实现iterator的功能使得可以正序和逆序访问sequence。最好的方法就是使用内部类(提供两个方法,返回两个各自实现iterator接口的内部类对象):
1 import java.util.Iterator; 2 3 public class Sequence 4 { 5 private Object[] items; 6 private int next = 0; 7 8 public Sequence(int size) 9 { 10 items = new Object[size]; 11 } 12 13 private class order1 implements Iterator 14 { 15 public boolean hasNext(){return false;} 16 public Object next(){return null;} 17 } 18 19 private class order2 implements Iterator 20 { 21 public boolean hasNext(){return false;} 22 public Object next(){return null;} 23 } 24 25 public Iterator i_order1() 26 { 27 return new order1(); 28 } 29 30 public Iterator i_order2() 31 { 32 return new order2(); 33 } 34 }