嵌套类是定义在另一个类的内部的类。嵌套类存在的目的应该只是为它的外部类提供服务。如果嵌套类可能会用于其它的某个场景中,它就应该是顶层类。嵌套类有四种:静态成员类,非静态成员类,局部类和匿名类,除了第一种外,其它三种都被称为内部类。
一:静态成员类
静态成员类可以看做是普通的类,只是碰巧被声明在另一个类的内部而已。它的一种常见的用法是作为共有的辅助类,仅当与它的外部类一起使用时才有意义。比如String类中的CaseInsensitiveComparator类,还有Integer类中的IntegerCache类。
二:非静态成员类 非静态成员类的每个实例都隐含着与外部类的一个实例相关联。非静态成员类实例的方法内部,可以调用外部类实例上的方法,或者利用this构造对外部类实例的引用。非静态成员类的一种常见用法是定义一个适配器,他允许外部类实例被看做是另一个不相关的类的实例。例如Map接口的实现类HaspMap会通过KeySet,EntrySet,Values等内部类来构造它的集合视图。
三:静态成员类与非静态成员类的选择 如果成员类的实例不需要访问外部类的实例,就该把该成员类声明为静态的。否则,每个实例都将包含一个对外部对象的引用。保存这份引用要消耗时间和空间,并且会导致外围实例在符合垃圾回收时却仍然得以保留。如果在没有外部实例的情况下也需要分配实例,就不能使用非静态成员类,因为它的实例必须要有一个外部实例。四:局部类
在任何“可以声明局部变量”的地方,都可以声明局部类,并且局部类也遵守同样的作用域规则。局部类必须非常简短,以便不会影响到可读性。
五:匿名类 匿名类没有名字。它不是外部类的一个成员。它并不与其它的成员一起被声明,而是在使用的同时被声明和实例化。它不能执行instanceof测试,或做任何需要命名类的其他事情。匿名类必须保持简短,否则会影响程序的可读性。
匿名内部类不能定义任何静态成员和静态方法;不能是public,protected,private,static;只能创建匿名内部类的一个实例;一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。
匿名内部类通常可分为继承式的或接口式的。比如我们在进行多线程编程的时候经常会用到:
new Thread() {
public void run() {
//类继承式的
}
}.start();
或
new Thread(new Runnable() {
public void run() {
// 接口实现式的
}
}).start();
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/28624388/viewspace-764578/
,如需转载,请注明出处,否则将追究法律责任。