在本教程中,您将借助示例学习嵌套的静态类。您还将了解静态类与内部类之间的区别。
如之前的教程所述,我们可以在Java的另一个类中拥有一个类。这样的类称为嵌套类。在Java中,嵌套类有两种类型:
嵌套的非静态类(内部类)
嵌套的静态类。
在上一教程中,我们已经讨论了内部类。如果您想了解内部类,请访问Java嵌套类。
在本教程中,我们将学习嵌套静态类。
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不允许使用静态顶级类,因此会出现错误。