HOWTO · Java

Java 中的靜態類

本文介紹 Java 靜態類。

在 Java 語言中,我們不能將外部類建立為靜態類,但是有特權可以將巢狀的內部類建立為靜態類。靜態類的屬性如下。

靜態內部類永遠不能訪問外部類的非靜態成員。

靜態內部類不需要任何外部類引用來訪問成員變數。

靜態類永遠無法例項化。因此,方法可以通過類名直接訪問。

下面是演示上述兩行的程式碼。

package static_class;

public class StaticInnerClass {
  static int i = 1;
  int j = 9;

  public static void main(String[] args) {
    StaticInnerClass s = new StaticInnerClass();
    // s.InnerClass.printNum();
    InnerClass.printNum();
  }

  public static class InnerClass {
    public static void printNum() {
      System.out.println(i);
      // System.out.println(j);
    }
  }
}

在上面的程式碼中,我們建立了一個名為 StaticInnerClass 的外部類。這個類有一個靜態欄位、非靜態欄位、靜態方法和一個靜態內部類。在靜態 main 方法中,我們建立了一個名為 s 物件的外部類的例項。當我們嘗試使用外部類物件訪問內部類 printNum() 方法時,即 s.InnerClass.printNum(); IDE 給出一個編譯時錯誤,它指出靜態內部類不需要外部類引用物件的任何引用來訪問內部類方法。因此,我們可以通過類名直接訪問內部類方法。

現在當我們看到 printNum() 方法的定義時。它有兩個列印語句。首先列印外部類的靜態欄位,然後嘗試列印相同的非靜態變數。語句 System.out.println(i); 是有效的,這意味著只能從靜態上下文訪問靜態成員。但是看看第二個語句,System.out.println(j); 無效,因為永遠不能從靜態上下文訪問非靜態成員。

在 Java 類中,不可能建立外部類靜態類。但是,我們可以使用一些定義的關鍵字來模仿行為。

final 關鍵字的使用是使類成為最終的。此關鍵字禁止類進一步擴充套件。原因是靜態類的擴充套件沒有用。

使用 private 關鍵字將建構函式設為私有,因為這會阻止靜態類的例項化。正如靜態類的屬性所說,永遠無法例項化它。

在成員變數和成員方法中使用 static 關鍵字。由於沒有建立物件,因此永遠無法訪問非靜態成員欄位和函式。

下面是一個定義的靜態類,它的用法用於製作 Utility 類,其中不需要建立此類的物件。

package static_class;

public final class StaticClass {
  private static int a = 1;

  private StaticClass() {
    System.out.println("Cannot be instantiated");
  }

  public static void printNum() {
    System.out.println(a);
  }
}