在Java中,可以在另一个类中定义一个类。这些类称为嵌套类。它们使您能够对只在一个地方使用的类进行逻辑分组。因此,这增加了封装的使用,并创建了更具可读性和可维护性的代码。
嵌套类的作用域由其封闭类的作用域限定。因此,在上面的例子中,类NestedClass并不独立于类的 OuterClass
外部类而存在。
嵌套类可以访问嵌套类的成员,包括私有成员。然而,反之则不然,即封闭类不能访问嵌套类的成员。
嵌套类也是其封闭类的成员。
作为其封闭类的成员,嵌套类可以声明为 private, public, protected, or package private (default)(私有、公共、受保护或包私有(默认))。
嵌套类分为两类:
1、静态嵌套类(static nested class):声明为静态的嵌套类称为静态嵌套类。
2、内部类(inner class):内部类是非静态嵌套类。
Syntax
代码语言:javascript复制class OuterClass
代码语言:javascript复制{
代码语言:javascript复制...
代码语言:javascript复制 class NestedClass
代码语言:javascript复制 {
代码语言:javascript复制 ...
代码语言:javascript复制 }
代码语言:javascript复制}
Static Nested Classes(静态嵌套类)
代码语言:javascript复制OuterClass.StaticNestedClass nestedObject =
代码语言:javascript复制 new OuterClass.StaticNestedClass();
代码语言:javascript复制// Java program to demonstrate accessing
代码语言:javascript复制// a static nested class
代码语言:javascript复制
代码语言:javascript复制// outer class
代码语言:javascript复制class OuterClass
代码语言:javascript复制{
代码语言:javascript复制 // static member
代码语言:javascript复制 static int outer_x = 10;
代码语言:javascript复制
代码语言:javascript复制 // instance(non-static) member
代码语言:javascript复制 int outer_y = 20;
代码语言:javascript复制
代码语言:javascript复制 // private member
代码语言:javascript复制 private static int outer_private = 30;
代码语言:javascript复制
代码语言:javascript复制 // static nested class
代码语言:javascript复制 static class StaticNestedClass
代码语言:javascript复制 {
代码语言:javascript复制 void display()
代码语言:javascript复制 {
代码语言:javascript复制 // can access static member of outer class
代码语言:javascript复制 System.out.println("outer_x = " outer_x);
代码语言:javascript复制
代码语言:javascript复制 // can access display private static member of outer class
代码语言:javascript复制 System.out.println("outer_private = " outer_private);
代码语言:javascript复制
代码语言:javascript复制 // The following statement will give compilation error
代码语言:javascript复制 // as static nested class cannot directly access non-static membera
代码语言:javascript复制 // System.out.println("outer_y = " outer_y);
代码语言:javascript复制
代码语言:javascript复制 }
代码语言:javascript复制 }
代码语言:javascript复制}
代码语言:javascript复制
代码语言:javascript复制// Driver class
代码语言:javascript复制public class StaticNestedClassDemo
代码语言:javascript复制{
代码语言:javascript复制 public static void main(String[] args)
代码语言:javascript复制 {
代码语言:javascript复制 // accessing a static nested class
代码语言:javascript复制 OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();
代码语言:javascript复制
代码语言:javascript复制 nestedObject.display();
代码语言:javascript复制
代码语言:javascript复制 }
代码语言:javascript复制}
Output:
代码语言:javascript复制outer_x = 10
代码语言:javascript复制outer_private = 30
Inner Classes(内部类)
要实例化内部类,必须首先实例化外部类。然后,使用以下语法在外部对象中创建内部对象:
代码语言:javascript复制OuterClass.InnerClass innerObject = outerObject.new InnerClass();
There are two special kinds of inner classes :
代码语言:javascript复制// Java program to demonstrate accessing
代码语言:javascript复制// a inner class
代码语言:javascript复制
代码语言:javascript复制// outer class
代码语言:javascript复制class OuterClass
代码语言:javascript复制{
代码语言:javascript复制 // static member
代码语言:javascript复制 static int outer_x = 10;
代码语言:javascript复制
代码语言:javascript复制 // instance(non-static) member
代码语言:javascript复制 int outer_y = 20;
代码语言:javascript复制
代码语言:javascript复制 // private member
代码语言:javascript复制 private int outer_private = 30;
代码语言:javascript复制
代码语言:javascript复制 // inner class
代码语言:javascript复制 class InnerClass
代码语言:javascript复制 {
代码语言:javascript复制 void display()
代码语言:javascript复制 {
代码语言:javascript复制 // can access static member of outer class
代码语言:javascript复制 System.out.println("outer_x = " outer_x);
代码语言:javascript复制
代码语言:javascript复制 // can also access non-static member of outer class
代码语言:javascript复制 System.out.println("outer_y = " outer_y);
代码语言:javascript复制
代码语言:javascript复制 // can also access private member of outer class
代码语言:javascript复制 System.out.println("outer_private = " outer_private);
代码语言:javascript复制
代码语言:javascript复制 }
代码语言:javascript复制 }
代码语言:javascript复制}
代码语言:javascript复制
代码语言:javascript复制// Driver class
代码语言:javascript复制public class InnerClassDemo
代码语言:javascript复制{
代码语言:javascript复制 public static void main(String[] args)
代码语言:javascript复制 {
代码语言:javascript复制 // accessing an inner class
代码语言:javascript复制 OuterClass outerObject = new OuterClass();
代码语言:javascript复制 OuterClass.InnerClass innerObject = outerObject.new InnerClass();
代码语言:javascript复制
代码语言:javascript复制 innerObject.display();
代码语言:javascript复制
代码语言:javascript复制 }
代码语言:javascript复制}
Output:
代码语言:javascript复制outer_x = 10
代码语言:javascript复制outer_y = 20
代码语言:javascript复制outer_private = 30
静态类和内部类(非静态嵌套类)的区别:
静态嵌套类不能直接访问封闭类的其他成员(非静态变量和方法),因为由于它是静态的,它必须通过对象访问封闭类的非静态成员。也就是说,它不能直接引用其封闭类的非静态成员。由于这个限制,静态嵌套类很少被使用。
非静态嵌套类(内部类)可以访问其外部类的所有成员(静态和非静态变量和方法,包括private),并且可以像外部类的其他非静态成员那样直接引用它们。