静态嵌套类(Static Nested Class),是 Java 中对类的一种定义方式,是嵌套类的一个分类。
Java 编程语言允许一个类被定义在另一个类中,这样的类就称为嵌套类。嵌套类分为两种:静态的和非静态的。用 static 关键字来声明的嵌套类,就称为静态嵌套类。
包含嵌套类的类,可称为外围类(Enclosing Class)或外部类(Outer Class)。静态嵌套类不能访问其外围类的其他成员。静态嵌套类作为其外部类的成员,它可声明为 private、public、protected 或包私有的。
Java嵌套静态类
我们使用关键字static使我们的嵌套类静态化。
注意:在Java中,仅允许嵌套类为静态。
与常规类一样,静态嵌套类可以同时包含静态和非静态字段和方法。例如,
Class Animal {
static class Mammal {
// Mammal类的静态和静态成员
}
// Animal类的成员
}静态嵌套类与外部类相关联。
要访问静态嵌套类,我们不需要外部类的对象。
示例:静态嵌套类
class Animal {
//内部类
class Reptile {
public void displayInfo() {
System.out.println("I am a reptile.");
}
}
//静态类
static class Mammal {
public void displayInfo() {
System.out.println("I am a mammal.");
}
}
}
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();
}
}输出结果
I am a reptile.
I am a mammal.在上面的程序中,我们在Animal类中有两个嵌套的Mammal和Reptile类。
为了创建非静态类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("I am a mammal.");
}
}
class Reptile {
public void displayInfo() {
System.out.println("I am a reptile.");
}
}
public void eat() {
System.out.println("I eat food.");
}
}
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("I am an animal");
}
}
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不允许使用静态顶级类,因此会出现错误。