suninf 's blog

It’s not what you know, it’s how you think

Java嵌套类

Catalog

嵌套类(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类型,这样就能减少对外围对象的引用,对性能和内存垃圾回收都有好处。

与非静态成员类的比较

  1. 静态内部类跟静态方法一样,只能访问静态的成员变量和方法,不能访问非静态的方法和属性,但是普通内部类可以访问任意外部类的成员变量和方法
  2. 静态内部类可以声明普通成员变量和方法,而普通内部类不能声明static成员变量和方法。
  3. 静态内部类可以单独初始化
// 静态内部类
Inner i = new Outer.Inner();

// 普通内部类
Outer o = new Outer();
Inner i = o.new Inner();

参考

Comments