1.内部类能访问他的外围对象的所有成员。因为当某个外围类对象创建了一个内部类对象时,此内部类对象必定会秘密地捕捉一个指向那个外围类对象的引用。

   在拥有外部类对象之前不能创建内部类对象,除非创建的是嵌套类(静态内部类)。


2.局部内部类

在类的方法中定义的类是局部内部类,只能在方法中使用。但是局部内部类可以外围类的所有成员。如下代码所示。

public class A {  <span style="white-space:pre">	</span>int a=0;  <span style="white-space:pre">	</span>class C{  <span style="white-space:pre">		</span>  <span style="white-space:pre">	</span>}      <span style="white-space:pre">	</span>public void hha(){  <span style="white-space:pre">	</span>    class B{  <span style="white-space:pre">		</span>    int c=a;  <span style="white-space:pre">	</span>     }  <span style="white-space:pre">	</span>    B b=new B();  <span style="white-space:pre">	</span>}  <span style="white-space:pre">	</span>      public static void main(String args[]){<span style="white-space:pre">	</span>      <span style="white-space:pre">	</span>A a=new A();      <span style="white-space:pre">	</span>A.C c=a.new C();      //<span style="white-space:pre">	</span>A.B b=a.new B();    错误,通不过编译。      }        }

3.匿名内部类

  

public class A { <span style="white-space:pre">	</span>  <span style="white-space:pre">	</span>int i=0;    <span style="white-space:pre">	</span>public int value(){return 1;} <span style="white-space:pre">	</span> <span style="white-space:pre">	</span>public static  A getOtherA(final int x){ <span style="white-space:pre">	</span>    return new A(){ <span style="white-space:pre">	</span>    <span style="white-space:pre">	</span>public int i=x; <span style="white-space:pre">	</span>    <span style="white-space:pre">	</span>public int value(){return i;} <span style="white-space:pre">	</span>    }; <span style="white-space:pre">	</span>} <span style="white-space:pre">	</span>     public static void main(String args[]){<span style="white-space:pre">	</span>         A a_otherA=A.getOtherA(2);         System.out.println(a_otherA.value());     }      }
//output:2
匿名内部类域正规的继承相比有些受限制,因为匿名内部类既可以拓展类也可以实现接口,但不能两者兼备。而且如果是要实现接口,也只能实现一个接口。

如果在匿名内部类中要使用外部定义的对象(or基本类型),那么必须把参数设置为final。


4.嵌套类

如果不需要内部类对象与其外围类对象之间有联系,那么可以把内部类声明为static,即嵌套类。

普通的内部类对象隐式的保存了一个引用,指向创建它的外围类对象。然而当内部类是static时:

1)要创建潜逃诶的对象,不需要其外围类对象。

2)不能从嵌套类的对象中访问非静态的外围类对象。

嵌套类和普通类还有一个区别:普通内部类的字段和方法只能放在类的外部层次上,所以普通内部类不能有static字段和方法,但嵌套类可以有。


5.在接口中的内部类。

正常情况下不能再接口内部放置任何代码,但嵌套类可以作为接口的一部分。在接口中的任何类都自动是public,static 的。如果想要创建某些公共代码,使得他们可以被某个接口的所有不同实现所共用,那么使用接口内部的嵌套类就显得很方便。


6.为什么要用内部类?!

每个内部类都能独立地继承自一个实现,无论外围类是否已经继承某个实现,对于内部类都没有影响。内部类使得多重继承的解决方案变得完整。接口解决了部分问题。

引用另一篇博客(链接:http://blog.csdn.net/ilibaba/article/details/3866537)的回答:

java内部类有什么好处?为什么需要内部类?
首先举一个简单的例子,如果你想实现一个接口,但是这个接口中的一个方法和你构想的这个类中的一个方法的名称,参数相同,你应该怎么办?这时候,你可以建一个内部类实现这个接口。由于内部类对外部类的所有内容都是可访问的,所以这样做可以完成所有你直接实现这个接口的功能。
不过你可能要质疑,更改一下方法的不就行了吗?
的确,以此作为设计内部类的理由,实在没有说服力。
真正的原因是这样的,java中的内部类和接口加在一起,可以的解决常被C++程序员抱怨java中存在的一个问题 没有多继承。实际上,C++的多继承设计起来很复杂,而java通过内部类加上接口,可以很好的实现多继承的效果。


7.内部类的继承

public class A { 	 	class C implements Comparable<String>,Serializable{                 C(){} 		@Override 		public int compareTo(String o) { 			// TODO 自动生成的方法存根 			return 0; 		} 		class CInnner{} 		 	} 	 	class D extends C.CInnner{ 		D(C c){ 			c.super(); 		} 	} 	 }
看到在D中,D的构造函数必须包含C的对象的参数。因为在C的CInner类的子类中已经不存在可连接的默认对象了。


8.闭包?不懂。


9.内部类与控制框架?还是不懂。

  留两个坑。待填。