内部类
内部类
Java的内部类可分为Inner Class、Anonymous Class和Static Nested Class三种:
Inner Class和Anonymous Class本质上是相同的,都必须依附于Outer Class的实例,即隐含地持有Outer.this实例,并拥有Outer Class的private访问权限;
Static Nested Class是独立类,但拥有Outer Class的private访问权限。
普通内部类:
要实例化一个Inner,我们必须首先创建一个Outer的实例,然后,调用Outer实例的new来创建Inner实例。这是因为Inner Class除了有一个this指向它自己,还隐含地持有一个Outer Class实例,可以用Outer.this访问这个实例。所以,实例化一个Inner Class不能脱离Outer实例。
内部类的作用域在外部类内部,所以内部类可以访问外部类的private字段和方法。
匿名内部类(常见):
当我们把内部类的定义和声明写到一起时,就不用给这个类起个类名而是直接使用了,这种形式的内部类根本就没有类名,因此我们叫它匿名内部类(Anonymous Class)。
我们只想用1次线程,但还要写一个MyThread类来继承Thread,有点麻烦,所以直接
匿名内部类的特点:
使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口
匿名内部类只能使用一次
一个类用于继承其他类或是实现接口,并不需要增加额外的方法,只是对继承方法的事先或是覆盖。
只是为了获得一个对象实例,不需要知道其实际类型。
类名没有意义,也就是不需要使用到。
静态内部类:
使用static修饰,称为静态内部类(Static Nested Class)
用static修饰的内部类不再依附于Outer外部类的实例,而是一个完全独立的类,因此无法引用Outer.this,但它可以访问Outer的private静态字段和静态方法。如果把StaticNested移到Outer之外,就失去了访问private的权限。
使用内部类的好处:
1. 内部类可以有多个实例,每个实例都有自己的状态信息,并且与其外围类对象那个的信息相互独立;
2. 在单个外围类中,可以让多个内部类以不同的方式实现同一个接口,或继承同一个类;
3. 方便将存在一定逻辑关系的类组织在一起,又可以对外界隐藏
4. 方便编写事件驱动程序;
5. 方便编写线程代码。