嵌套类(nested class)是指定义在另一个类内部的类,嵌套类存在的目的应该只是为外围类提供服务。
嵌套类的分类:
- 内部类(inner class)
- 非静态成员类(nonstatic member class)
- 匿名类(anonymous class)
- 局部类(local class)
- 静态成员类(static member class)
内部类
非静态成员类
非静态成员类即成员内部类,当创建成员内部类时,会与外围类对象相关联。
- 成员内部类就是作为外部类的成员,可以直接使用外部类的所有成员和方法,即使是private。
- 外部类要访问内部类的所有成员变量或方法,则需要通过内部类的对象来获取
成员内部类不能含有 static 的变量和方法。
class Outter { private String value = "hello"; class Inner { public void print() { System.out.println(value); } } } @Test public void testMySelf() { Outter out = new Outter(); Outter.Inner in = out.new Inner(); in.print(); }
匿名类
匿名内部类经常是在编写事件监听的代码时使用匿名内部类,而且使代码更加容易维护。
myService.setNotifyListener(new NotifyListener() {
@Override
public void notify() {
}
});
局部类
如果一个辅助类型仅服务于一个方法,可以考虑在方法内部创建一个局部类。
静态成员类
- 静态成员类可以当成普通的类,只是恰巧被声明在外部类中,并且作为外围类的静态成员,可以通过外围类名来访问
- 如果成员类不需要访问外围实例,就要声明为static类型,这样就能减少对外围对象的引用,对性能和内存垃圾回收都有好处。
与非静态成员类的比较
- 静态内部类跟静态方法一样,只能访问静态的成员变量和方法,不能访问非静态的方法和属性,但是普通内部类可以访问任意外部类的成员变量和方法
- 静态内部类可以声明普通成员变量和方法,而普通内部类不能声明static成员变量和方法。
静态内部类可以单独初始化
// 静态内部类 Inner i = new Outer.Inner(); // 普通内部类 Outer o = new Outer(); Inner i = o.new Inner();
参考
- 《Effective Java》第22条
- http://www.cnblogs.com/Alex–Yang/p/3386863.html
- http://blog.csdn.net/panda1234lee/article/details/8256332
- http://www.cnblogs.com/hasse/p/5020519.html
- http://www.cnblogs.com/dolphin0520/p/3811445.html
- https://www.cnblogs.com/chenssy/p/3388487.html
- http://www.imooc.com/article/13448