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)的回答:
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.内部类与控制框架?还是不懂。
留两个坑。待填。