Java-0012-嵌套类

2016.7.21

嵌套类Nested Class

多数情况下把nested class分为两种
Static Nested Class(静态嵌套类):就是用static修饰的成员嵌套类
Inner Class(内部类):静态嵌套类之外所有的嵌套类的总称,也就是没有用static定义的nested classes

而Inner class又可以分为三种
inner member class
没有用static 修饰的成员内部类
local inner class
定义在方法里面的内部类,方法可以是static的也可以是非static的,也可以是构造器方法。
anonymous inner class
匿名内部类,定义在方法里面匿名类,方法可以是static的也可以是非static的

访问规则

Static Nested Class(静态嵌套类)

用Static修饰的Nested Classes,只能访问外部类的static变量。
对于public 的 static Nested Classes 可以用 new 外部类.内部类()的方式直接创建。而
用默认(default)的static Nested Classes 可以在同一包名下,用 new 外部类.内部类()的方式创建。其实和外部类的方式差不多。静态成员类可以使用访问控制符,可以使用static修饰,可以是abstract抽象类

Inner Class访问规则

inner member classes(内部成员类) 可以访问外部类的所有实例属性,静态属性。因为内部成员类持有一个外部对象的引用,内部类的实例可以对外部类的实例属性进行修改。如果是public的 inner member classes,可以通过 外部类实例.new 内部类()的方式进行创建,当调用内部类的构造器的时候,会把当前创建的内部类对象实例中持有的外部对象引用赋值为当前创建内部类的外部类实例。内部成员类可以是使用访问控制符,可以定义为final,也可以是抽象类。

local inner classes(局部类)

局部类 定义在类方法里面。这个方法既可以是静态方法,也可以是实例方法,也可以是构造器方法或者静态初始化语句块。

局部类可以定义在一个static上下文里面 和 非static上下文里面。局部类不能有访问控制符(private,public,protected修饰),可以是抽象的,也可以定义为final

定义在static上下文(static 字段初始化,static初始化块,static方法)里面的local inner classes 可以访问类的静态属性,如果定义在静态方法里面的局部类,还可以使用方法里面定义的final变量。在static上下文定义的局部类,没有指向父类实例变量的引用,因为static方法不属于类的实例,属于类本身。而且局部类不能在外部进行创建,只能在方法调用的时候进行创建。

anonymous inner classes (匿名类)

也是定义在方法里面,匿名类和局部类访问规则一样,只不过内部类显式的定义了一个类,然后通过new的方式创建这个局部类实例,而匿名类直接new一个类实例,没有定义这个类。匿名类最常见的方式就是回调模式的使用,通过默认实现一个接口创建一个匿名类然后,然后new这个匿名类的实例。

参考文章:java嵌套类(Nested Classes)总结

你可能感兴趣的:(Java-0012-嵌套类)