JAVA内部类学习

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 }
原文地址:https://www.cnblogs.com/huoxiayu/p/5759855.html