Java 菜鸟教程

Java 流程控制

Java 数组

Java 面向对象(I)

Java 面向对象(II)

Java 面向对象(III)

Java 异常处理

Java 列表(List)

Java Queue(队列)

Java Map集合

Java Set集合

Java 输入输出(I/O)

Java Reader/Writer

Java 其他主题

Java 嵌套静态类

在本教程中,您将借助示例学习嵌套的静态类。您还将了解静态类与内部类之间的区别。

如之前的教程所述,我们可以在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不允许使用静态顶级类,因此会出现错误。