class OuterClass { ... class NestedClass { ... } }
那么在上面的例子中我们称OuterClass为外围类(enclosing class),里面的那个类称之为嵌套类(Nested Class).
嵌套类可以分为两种,静态的和非静态的,即静态嵌套类和非静态嵌套类。非静态嵌套类又叫做内部类(Inner Class)。我们通常所说的静态内部类其实是不严格的,严格的说应该叫做静态嵌套类(Static Nested Class)。
class OuterClass { ... class InnerClass { ... } static class StaticNestedClass { ... } }
上述代码中的InnerClass就是内部类,StaticNestedClass就是静态嵌套类。
内部类与静态嵌套类虽然都是嵌套类,但在使用上是有一些区别的。
内部类
比如有如下内部类的定义,
class OuterClass { ... class InnerClass { ... } }OuterClass是InnerClass的外围类,InnerClass是OuterClass的内部类。内部类的实例对象都会绑定一个外围类的实例对象,并且InnerClass可以访问其所绑定的OuterClass的所有成员属性以及方法,包括私有成员属性以及方法。在InnerClass中通过OuterClass.this 显式的 引用其所绑定的OuterClass的实例。要实例化内部类InnerClass,必须首先实例化其外围类OuterClass,然后用如下的语法创建内部类的实例:
OuterClass outerObject = new OuterClass(); OuterClass.InnerClass innerObject = outerObject.new InnerClass();
class OuterClass { ... static class StaticNestedClass { ... } }那么我可以像正常使用一个一般的静态类那样使用一个静态嵌套类,只不过要通过其外围类的名字来访问静态嵌套类的名字。所以,外围类更像是静态嵌套类的命名空间。比如要获取静态嵌套类,要使用 OuterClass.StaticNestedClass。
OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();
综上所述,虽然内部类和静态嵌套类都属于嵌套类,但是二者有本质区别:内部类的实例化对象需要绑定一个外围类的实例化对象,而静态嵌套类的实例化对象不能也无法绑定外围类的实例化对象。