一、定义
内部类分为成员内部类、局部内部类、静态内部类、匿名内部类四种,使用内部类最吸引人的原因是:每个内部类都能独立地继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。
二、用法
(一) 成员内部类
1.成员内部类也是最普通的内部类,它是外围类的一个成员,所以他是可以无限制的访问外围类的所有成员属性和方法,尽管是private的,但是外围类要访问内部类的成员属性和方法则需要通过内部类实例来访问。
1)成员内部类中不能存在任何static的变量和方法。
2)成员内部类是依附于外围类的,所以只有先创建了外围类才能够创建内部类。
3)推荐使用getxxx()来获取成员内部类,尤其是该内部类的构造函数无参数时 。
(二) 局部内部类
1.对于这个类的使用主要是应用与解决比较复杂的问题,想创建一个类来辅助我们的解决方案,到那时又不希望这个类是公共可用的,所以就产生了局部内部类,局部内部类和成员内部类一样被编译,只是它的作用域发生了改变,它只能在该方法和属性中被使用,出了该方法和属性就会失效。
1)方法内部类只能在定义该内部类的方法内实例化,不可以在此方法外对其实例化。
2)方法内部类对象不能使用该内部类所在方法的非final局部变量。(因为方法的局部变量位于栈上,只存在于该方法的生命期内。当一个方法结束,其栈结构被删除,局部变量成为历史。但是该方法结束之后,在方法内创建的内部类对象可能仍然存在于堆中!例如,如果对它的引用被传递到其他某些代码,并存储在一个成员变量内。正因为不能保证局部变量的存活期和方法内部类对象的一样长,所以内部类对象不能使用它们。)
(三) 静态内部类
1.被static修饰的内部类,它可以不依赖于外部类实例对象而被实例化,而通常的内部类需要在外部类实例化后才能实例化。静态内部类不能与外部类有相同的名字,不能访问外部类的普通成员变量,只能访问内部类中的静态成员和静态方法(包括私有类型)。
(四) 匿名内部类
1.正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写。
1)匿名内部类是没有访问修饰符的。
2)一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。
3)当所在方法的形参需要被匿名内部类使用,那么这个形参就必须为final。
4)匿名内部类是没有构造方法的,因为它连名字都没有何来构造方法。
5)因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。
6)使用场景:只用到类的一个实例、类在定义后马上用到、类非常小(SUN推荐是在4行代码以下)。
三、总结
1.每个内部类都能独立的继承一个接口的实现,所以无论外部类是否已经继承了某个(接口的)实现,对于内部类都没有影响。内部类使得多继承的解决方案变得完整,
2.方便将存在一定逻辑关系的类组织在一起,又可以对外界隐藏。
3.方便编写事件驱动程序。
4.方便编写线程代码。