嵌套类的设计与使用是Java 码农在OOD、OOP中的一件顺手工具,这一点是毋庸置疑的,但怎样正确使用嵌套类在实际的编程中呢?下文会针对这一话题展开叙述。
什么是嵌套类?
在Java语言的世界里允许在一个类的内部定义类,如下代码所示:
class OuterClass {
      class NestedClass{
         ...    }
}
术语: 嵌套类分为静态和非静态两类; 声明为static的嵌套类我们称为"静态嵌套类",而未声明为static的嵌套类我们称之为"内部类"
class OuterClass {
 ...
      static class StaticNestedClass{
            ...      }
      class InnerClass{
          ...     }
}
作为包装类的一个成员,非静态嵌套类(内部类)可以有权访问其包装类的成员变量(甚至包括私有变量),然而静态的嵌套类却不可以访问其包装类的任何成员变量。 内部类可以声明为public , protected, package private, private 访问权限。

为什么要使用嵌套类(什么情况必须使用嵌套类)?
  • 使用嵌套类可以对只在一处使用的类进行更好的逻辑分包
如果一个类A只对一个类B有用,并且逻辑上这个类A能够内嵌到这个类B中,使这两个类放在一起,将这样的"帮助类"B设计为内部类将使包结构更加顺畅,优美。
  • 使用嵌套类可以提升封装性
当类B需要访问类A中必须声明为private的成员变量的时候。如果将类B声明为内部类,这样既可以满足需求而且可以将B声明为private或其他权限将类B隐藏起来。
  • 使用嵌套类可以提供可读性好,高可维护的代码
将相近的类声明为内部类,使得代码更加符合逻辑,可读性更好,可维护性更好。

静态嵌套类

想要通过静态嵌套类直接访问包装类的成员变量? No Way,那是内部类(非静态嵌套类)能做的。静态嵌套类只能与其他静态类一样通过拿到引用的方式访问成员变量。既然不能访问包装类的成员变量,为什么要使用内部类呢?为了方便逻辑上类的分包。静态嵌套类可以通过"包装类.嵌套类"方式访问,如:
OuterClass.StaticNestedClass
内部类的对象可以通过"new 包装类.嵌套类()"方式实例化。

内部类(非静态嵌套类)

从实例成员变量和方法的角度来看,由于内部类的存在依赖于包装类的存在,因此内部类中不能定义任何static 的成员。
内部类的实例只能存在于包装类内部,并且可以直接访问包装类内部的方法和变量。如下图所示
基于以上描述的内部类与包装类的关系,需要实例化一个内部类就必须先实例化这个包装类,如:
OuterClass.InnerClass innerObject = outerObject.new InnerClass();

参考翻译自Sun java tutorial 文档 原文链接