Java的嵌套类与内部类

在 Java 中,根据类的定义位置和特性,可以将类分为四种类型:顶层类、嵌套类、内部类和静态嵌套类。

其中嵌套类和内部类也是非常常见,但是在方法或者变量的使用时会让人糊涂。下面详细看看他们的使用。

嵌套类(Nested Class)

首先,嵌套类(Nested Class)包含静态嵌套类(Static Nested Class)和非静态嵌套类(Non-static Nested Class,又称为内部类Inner Class)。
Nested Class

静态嵌套类(Static Nested Class)

静态嵌套类使用 static 修饰符定义,它可以独立存在,而不依赖于外部类的实例。静态嵌套类不能访问外部类的非静态成员,但可以访问外部类的静态成员。创建静态嵌套类的实例不需要外部类的实例。

1
2
3
4
5
6
7
8
9
10
11
12
public class OuterClass {
private static String staticVariable = "Static Variable";
private String nonStaticVariable = "Non-static Variable";

static class StaticNestedClass {
public void display() {
System.out.println(staticVariable); // 可以访问静态变量
// System.out.println(nonStaticVariable); // 无法访问非静态变量
}
}
}

非静态嵌套类(Non-static Nested Class)又称内部类(Inner Class)

内部类是非静态的嵌套类,它与外部类有一个紧密的关联,并且可以访问外部类的所有成员(包括私有成员)。内部类的实例总是与外部类的实例相关联。

1
2
3
4
5
6
7
8
9
10
11
public class OuterClass {
private static String staticVariable = "Static Variable";
private String nonStaticVariable = "Non-static Variable";

class InnerClass {
public void display() {
System.out.println(staticVariable); // 可以访问静态变量
System.out.println(nonStaticVariable); // 可以访问非静态变量
}
}
}

成员内部类和局部内部类

成员内部类: 定义在外部类的成员位置。
局部内部类: 定义在外部类的局部位置,也就是外部类中的方法内部。

嵌套类与外部类的数据访问

外部类访问嵌套类

  1. 嵌套类是Static的
    因为Static的是类属性,无需创建实例,所以可以直接通过类名访问。
    1
    2
    3
    // 若是在OuterClass中,可去掉OuterClassName
    OuterClassName.NestedClassName.methodName()
    OuterClassName.NestedClassName.variable // 变量的访问
  2. 嵌套类不是是Static的
    此时类是实例属性,需要创建实例。
    1
    2
    3
    4
    OuterClass outerObj = new OuterClass();
    OuterClass.InnerClass innerObj = outerObj.new InnerClass();
    outerObj.methodName()
    outerObj.variable // 变量的访问

嵌套类访问外部类

  1. 静态嵌套类
    静态嵌套类可以访问外部类的静态成员,但不能直接访问非静态成员。要访问非静态成员,需要通过外部类的实例。
1
2
3
4
5
staticVariable  // 外部的静态成员直接访问
OuterClass.staticVariable // 或者加上类名(防止重名歧义)

OuterClass outerInstance = new OuterClass();
outerInstance.this.nonStaticVariable // 外部的非静态成员须通过外部实例
  1. 非静态嵌套类(内部类)
    内部类可以直接访问外部类的所有成员(包括静态和非静态成员),不需要外部类的实例。
查看评论