java嵌套种(Nested Classes)总结(转)

java嵌套类(Nested Classes)总结(转)原文链接: http://www.cnblogs.com/aigongsi/archive/2012/04/24/2467

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编译器对嵌套类的处理才可以深入了解嵌套类细节。