java嵌套类(Nested Classes)总结(转)
原文链接: http://www.cnblogs.com/aigongsi/archive/2012/04/24/2467183.html
java嵌套类(Nested Classes)总结
Nested Classes定义
在java语言规范里面,嵌套类(Nested Classes)定义是:
A nested class is any class whose declaration occurs within the body of another class or interface. A top level class is a class that is not a nested class.
说的简单一点,就是定义在类里面的类。一般把定义内部类的外围类成为包装类(enclosing class)或者外部类
嵌套类分类
根据nested class定义的地方,可以分为member nested class,local nested class , anonymous nested class
member nested class(成员嵌套类) :成员嵌套类 作为 enclosing class 的成员定义的,成员嵌套类有enclosing class属性
local nested class (局部嵌套类): 局部嵌套类定义在 enclosing class 的方法里面,局部嵌套类有enclosing class 属性和enclosing method 属性
anonymous nested class(匿名嵌套类):匿名嵌套类没有显示的定义一个类,直接通过new 的方法创建类的实例。一般回调模式情况下使用的比较多
member nested class 可以使用public,private,protected访问控制符,也可以用static,final关键字
local nested class 可以使用final关键字
anonymous nested class 不使用任何关键字和访问控制符
见下面的代码
?
public class NestedClassLevel { class A { // 编译器会报错,A里面不能在定义名为A的nested classes // class A{} public void test() { class B { } } } //可以在继续定义B class B { public void test(){ //可以无限定义匿名类 new Runnable() { public void run() { //可以无限定义匿名类 new Runnable() { public void run() { } }; } }; } } // 只能定义一个B // class B{} public void test() { // 可以定义A class A { public void test() { //可以有同名的局部类B和成员类B class B { public void test() { } } //局部类A里面不能在定义A //class A{} } } //可以有同名的局部类B和成员类B class B { } } }对于定义在非static上下文里面的nested类层次,比如A$B$1C ,则最内层的嵌套类C有一个指向B实例的引用,B有一个指向A实例的引用,最终最内层的嵌套类可以访问A中的属性可以方法,一般把B成为A的直接嵌套类。但是A不可以访问B或者C中属性或者方法。
nested interface
由于interface默认是定义为一个 public static的特殊类,所以interface可以直接作为 static member class。可以通过A.B的方式进行访问。
nested class的应用
在java提供的基本类库里面,大量使用nested classes。比如我们知道的map类。其中 Map类里面有一个定义了Entry类abstract inner class。所以我们在遍历map的时候,一般使用
for (Map.Entry entry:map.entrySet()){
}
总结:nested类是java里面比较复杂的一个概念,必须详细了解jvm中对于嵌套类的实现以及java编译器对嵌套类的处理才可以深入了解嵌套类细节。
