跳到主要内容

Java 静态嵌套类

提示
  1. 静态嵌套类定义:静态嵌套类(与非静态内部类相反)是使用 static 关键字定义的类,可以独立于外部类的实例存在。
  2. 创建和访问方式:静态嵌套类的实例可以直接通过外部类创建,不需要外部类的对象实例,如 Animal.Mammal mammal = new Animal.Mammal()
  3. 访问限制:静态嵌套类只能访问外部类的静态成员,无法直接访问外部类的非静态成员,如实例方法或字段。

如之前的教程所学,我们可以在 Java 中在一个类里面嵌套另一个类。这样的类被称为嵌套类。在 Java 中,嵌套类有两种类型:

  • 嵌套非静态类(内部类)
  • 嵌套静态类。

我们在之前的教程中已经讨论过内部类。如果您想了解内部类,请访问 Java 嵌套类

在这个教程中,我们将学习嵌套静态类。

Java 嵌套静态类

我们使用关键字 static 来使我们的嵌套类成为静态的。

注意: 在 Java 中,只有嵌套类才能被声明为静态的。

像普通类一样,静态嵌套类可以包含静态和非静态的字段和方法。例如,

class Animal {
static class Mammal {
// Mammal 的静态和非静态成员
}
// Animal 的成员
}

静态嵌套类与外部类关联。

要访问静态嵌套类,我们不需要外部类的对象。

示例:静态嵌套类

class Animal {

// 内部类
class Reptile {
public void displayInfo() {
System.out.println("我是一只爬行动物。");
}
}

// 静态类
static class Mammal {
public void displayInfo() {
System.out.println("我是一只哺乳动物。");
}
}
}

class Main {
public static void main(String[] args) {
// 创建外部类的对象
Animal animal = new Animal();

// 创建非静态类的对象
Animal.Reptile reptile = animal.new Reptile();
reptile.displayInfo();

// 创建静态嵌套类的对象
Animal.Mammal mammal = new Animal.Mammal();
mammal.displayInfo();

}
}

输出

我是一只爬行动物。
我是一只哺乳动物。

在上面的程序中,我们在 Animal 类中有两个嵌套类 MammalReptile

为了创建非静态类 Reptile 的对象,我们使用了

Animal.Reptile reptile = animal.new Reptile()

为了创建静态类 Mammal 的对象,我们使用了

Animal.Mammal mammal = new Animal.Mammal()

访问外部类的成员

在 Java 中,静态嵌套类与外部类关联。这就是为什么静态嵌套类只能访问外部类的类成员(静态字段和方法)。

让我们看看如果尝试访问外部类的非静态字段和方法会发生什么。

示例:访问非静态成员

class Animal {
static class Mammal {
public void displayInfo() {
System.out.println("我是一只哺乳动物。");
}
}

class Reptile {
public void displayInfo() {
System.out.println("我是一只爬行动物。");
}
}

public void eat() {
System.out.println("我吃食物。");
}
}

class Main {
public static void main(String[] args) {
Animal animal = new Animal();
Animal.Reptile reptile = animal.new Reptile();
reptile.displayInfo();

Animal.Mammal mammal = new Animal.Mammal();
mammal.displayInfo();
mammal.eat();
}
}

输出

Main.java:28: error: cannot find symbol
mammal.eat();
^
symbol: method eat()
location: variable mammal of type Mammal
1 error
compiler exit status 1

在上面的示例中,我们在 Animal 类内部创建了一个非静态方法 eat()

现在,如果我们尝试使用对象 mammal 来访问 eat(),编译器会显示错误。

这是因为 mammal 是静态类的一个对象,我们不能从静态类中访问非静态方法。

静态顶级类

如上所述,只有嵌套类可以是静态的。我们不能拥有静态顶级类。

让我们看看如果我们尝试使顶级类成为静态会发生什么。

static class Animal {
public static void displayInfo() {
System.out.println("我是一只动物");
}
}

class Main {
public static void main(String[] args) {
Animal.displayInfo();
}
}

输出

Main.java:1: error: modifier static not allowed here
static class Animal {
^
1 error
compiler exit status 1

在上述示例中,我们尝试创建一个静态类 Animal。由于 Java 不允许静态顶级类,我们会得到一个错误。