四种内部类
Java中有四种内部类,静态内部类,非静态内部类,匿名内部类,局部类。
《Effectvie Java》中有一句话说的话,内部类存在的唯一唯一作用是为其外围类(enclosing class)服务。这是使用内部类的根本的立足点。
静态内部类和非静态内部类
这2种内部类的区别在于,非静态内部类的实例,都拥有一个指向其外围类实例的引用。在大量应用的场合,非静态内部类就会存在大量指向外围类实例的指针,存在一定的资源浪费,当然这是相对的,在适合应用非静态内部类的场合,是不能摒弃非静态内部类的。只是我们应该有这么一个原则:能用静态内部类,就不要使用非静态内部类。
立足于内部类的存在是为外围类服务的这一基本点,非静态成员类的一种常见用法是,允许外围类的实例被看做是另外一个不相关的类的实例。例如,Map接口的实现使用了大量的非静态成员类来实现它的一些视图,例如keySet,valueSet等。
举例说明用法:
最近遇到这样一个需求,需要求2个特定日志之间所有的日期的年份和日。显然,从OOP的角度来看,我们需要把年份和日组合成一个对象,然后返回这个对象的一个集合。而这个对象所属的类,在其他地方是不需要使用到的,因此没有必要上升到一个顶层的外部类,故使用静态内部类最合适。
1 | static class YearAndDay{ |
匿名内部类和局部类
这两种类不细说,以后再补充。