静态内部类的用法


这里说明public 修饰的静态内部类其实跟外部类的使用并没有太大区别,以“OuterClass.InnerClass”的方式来引用某个如此修饰的静态内部类。

静态成员类特性

  • 静态成员类可访问外部类的任一静态字段或静态方法
  • 像静态方法或静态字段一样,静态成员类有public/private/default权限修饰符

静态成员类约束

  • 静态成员类不能与外部类重名。
  • 像外部类的静态方法一样,不能直接访问外部类的实例字段和实例方法
  • 静态内部类可以有静态成员,而非静态内部类则不能有静态成员。
  • 静态内部类的非静态成员可以访问外部类的静态变量,而不可访问外部类的非静态变量。
  • 静态成员类只能定义于外部类的顶层代码或外部类其它静态成员类的顶层代码中(嵌套定义);不能定义于外部类的某个函数中。

什么时候使用静态成员类

B为A的辅助类,且只为A所用时,可将B定义为A的静态成员类。 在进行代码程序测试的时候,如果在每一个Java源文件中都设置一个主方法(主方法是某个应用程序的入口,必须具有),那么会出现很多额 外的代码。而且最主要的时这段主程序的代码对于Java文件来说,只是一个形式,其本身并不需要这种主方法。但是少了这个主方法又是万万不行的。在这种情 况下,就可以将主方法写入到静态内部类中,从而不用为每个Java源文件都设置一个类似的主方法。这对于代码测试是非常有用的。


非静态内部类的用法

非静态内部类的特性

  • 非静态内部类,可以随意的访问外部类中的成员变量与成员方法。即使这些成员方法被修饰为 private(私有的成员变量或者方法),其非静态内部类都可以随意的访问。
  • 非静态内部类的非静态成员可以访问外部类的非静态变量。

类似于外部类的实例函数,成员类有public/private/default权限修饰符 一个成员类实例必然所属一个外部类实例,成员类可访问外部类的任一个实例字段和实例函数。 一个成员类实例必然所属于其外部类的一个实例,那么如何在成员类内部获得其所属外部类实例呢?如示例代码所示,采用“OuterClass.this”的形式。 定内部类实例所属的外部类实例 内部类实例可在其外部类的实例方法中创建,此新创建内部类实例所属的外部类实例自然就是创建它的外部类实例方法对应的外部类实例。 另外,如示例代码所示,对于给定的一个外部类实例outerClass,可以直接创建其内部类实例,语法形式为: OuterClass.InnerClass innerClass = outerClass.new InnerClass();


成员类约束

  • 成员类不能与外部类重名
  • 不能在成员类中定义static字段、方法和类(static final形式的常量定义除外),即在非静态内部类中不可以声明静态成员。因为一个成员类实例必然与一个外部类实例关联,这个static定义完全可以移到其外部类中去
  • 成员类不能是接口(interface)。因为成员类必须能被某个外部类实例实例化,而接口是不能实例化的。事实上,如示例代码所示,如果你以成员类的形式定义一个接口,该接口实际上是一个静态成员类,static关键字对inner interface是内含(implicit)的。
  • 普通非静 态内部类的对象是依附在外部类对象之中的。

什么时候使用成员类

成员类的显著特性就是成员类能访问它的外部类实例的任意字段与方法。方便一个类对外提供一个公共接口的实现是成员类的典型应用。