梳理一下Java内部类:
[b]用途:[/b]
1.当一个类A需要访问类B的私有属性时候,可以将A设计为内部类,即保证了B的封装又满足了A的设计需求,并可将A的可见性降到最低。
2.当一个类A只需要被类B使用,可以将A设计为内部类,作用同下。
3.减少顶级类数量,使代码更具可读性。
4.匿名内部类只创建一次,多用于事件处理
[b]非静态内部类:Inner Class[/b]
[list]
[*]初始化方法 Outer.Inner i =outerInstance.new Inner(),需要引用外部类的实例
[*]可以访问外部类的属性,包括private等各种访问级别,也包括static变量(且必须final)、方法,且可以通过变量名直接引用外部类的static变量、方法
[*]如果内部类变量与外部类变量同名(非静态的变量),则通过Outer.this.outerSanmeVar方式访问
[*]非静态内部类因为关联了外部类的实例,所以不能有静态变量、者静态方法、静态代码块、静态内部类!
[/list]
[b]静态内部类:Static Nested Class[/b]
[list]
[*]可以直接初始化方法 Outer.StaticInner os = new Outer.StaticInner();
[*]不能访问外部类的非静态属性,即没有外部类的实例引用,无法使用Outer.this
[/list]
====局部类和匿名类是非静态内部类的两个特殊情况:
[b]局部类:local classes[/b]
[list]
[*]可以在方法(含静态)和任意{}内部定义类,即局部类,但不能定义局部静态类
[*]局部类没有访问权限限定符public/private,但可以为final,和abstract
[*]如果局部类定义在static块/方法内,则没有外部类的引用,即无法使用外部类的实例属性等
[/list]
[b]匿名类:anonymous classes/anonymous inner classes[/b]
[list]
[*]可以在任意{},包括static{}定义使用匿名类
[*]初始化:new Interface(){...} 或者 new SuperClass(){....}
[*]匿名类因为没有名字所以不能定义构造函数
[*]匿名类如果有父类,会调用父类的构造函数,如果构造函数有参数,需要在 new Anony(参数..){..}
[*]匿名类可以访问外部类的变量(包括静态),另外:
* 在方法内或{}内时,不能访问外层方法/作用域中的非fianl变量
* 在静态static{}块中时,除了块内final变量,只能访问外部类的static变量(因为没有外部类实例)
[/list]
参考:
1.Sun Java Tutorials - Nested Classes:[url]http://java.sun.com/docs/books/tutorial/java/javaOO/nested.html[/url]
[b]用途:[/b]
1.当一个类A需要访问类B的私有属性时候,可以将A设计为内部类,即保证了B的封装又满足了A的设计需求,并可将A的可见性降到最低。
2.当一个类A只需要被类B使用,可以将A设计为内部类,作用同下。
3.减少顶级类数量,使代码更具可读性。
4.匿名内部类只创建一次,多用于事件处理
[b]非静态内部类:Inner Class[/b]
[list]
[*]初始化方法 Outer.Inner i =outerInstance.new Inner(),需要引用外部类的实例
[*]可以访问外部类的属性,包括private等各种访问级别,也包括static变量(且必须final)、方法,且可以通过变量名直接引用外部类的static变量、方法
[*]如果内部类变量与外部类变量同名(非静态的变量),则通过Outer.this.outerSanmeVar方式访问
[*]非静态内部类因为关联了外部类的实例,所以不能有静态变量、者静态方法、静态代码块、静态内部类!
[/list]
[b]静态内部类:Static Nested Class[/b]
[list]
[*]可以直接初始化方法 Outer.StaticInner os = new Outer.StaticInner();
[*]不能访问外部类的非静态属性,即没有外部类的实例引用,无法使用Outer.this
[/list]
====局部类和匿名类是非静态内部类的两个特殊情况:
[b]局部类:local classes[/b]
[list]
[*]可以在方法(含静态)和任意{}内部定义类,即局部类,但不能定义局部静态类
[*]局部类没有访问权限限定符public/private,但可以为final,和abstract
[*]如果局部类定义在static块/方法内,则没有外部类的引用,即无法使用外部类的实例属性等
[/list]
[b]匿名类:anonymous classes/anonymous inner classes[/b]
[list]
[*]可以在任意{},包括static{}定义使用匿名类
[*]初始化:new Interface(){...} 或者 new SuperClass(){....}
[*]匿名类因为没有名字所以不能定义构造函数
[*]匿名类如果有父类,会调用父类的构造函数,如果构造函数有参数,需要在 new Anony(参数..){..}
[*]匿名类可以访问外部类的变量(包括静态),另外:
* 在方法内或{}内时,不能访问外层方法/作用域中的非fianl变量
* 在静态static{}块中时,除了块内final变量,只能访问外部类的static变量(因为没有外部类实例)
[/list]
参考:
1.Sun Java Tutorials - Nested Classes:[url]http://java.sun.com/docs/books/tutorial/java/javaOO/nested.html[/url]