HOWTO · Java

Java 中 static 變數和 final 變數之間的區別

它顯示了 Java 中靜態變數和最終變數之間的區別。此外,將通過程式碼示例討論這兩個變數的使用。

本教程展示了 staticfinal 關鍵字之間的區別。讓我們以表格格式和工作示例討論差異。

static final
宣告期間不需要初始化靜態變數。 宣告最終變數時需要對其進行初始化。
靜態變數可以重新初始化 最終變數無法重新初始化。
它與巢狀的靜態類、變數、方法和塊一起使用。 它與類、方法和變數一起使用。
靜態方法只能被其他靜態方法呼叫。 最終方法不能被子類覆蓋。

Java 中的靜態變數

當我們建立一個靜態變數或方法時,它是附加到類而不是物件上的。變數或方法將共享整個程式的相同引用。

下面的程式有一個類 DummyClass,其中包含一個靜態變數 num 和一個名為 dummyMethod()static 方法。要從另一個類訪問這兩個成員,我們不能建立 DummyClass 的物件,因為它們是靜態的。

我們使用類名直接呼叫它們。

例子:

public class ExampleClass3 {
  public static void main(String[] args) {
    DummyClass.num = 5;
    System.out.println("Static variable value: " + DummyClass.num);
    DummyClass.dummyMethod();
  }
}

class DummyClass {
  public static int num = 0;

  public static void dummyMethod() {
    System.out.println("Inside Static Dummy Method");
  }
}

輸出:

Static variable value: 5
Inside Static Dummy Method

使用 static 關鍵字的巢狀類,不引用外部類。我們可以使用 static 關鍵字在類中建立內部類。

在下面的示例中,我們有一個類 DummyClass,在其中,我們建立了一個名為 InnerClass 的靜態類,在這個類中,我們建立了一個方法 dummyMethod()

現在在 ExampleClass3 類中,我們使用 DummyClass.InnerClass 獲取 InnerClass 並建立 DummyClass 類的物件並呼叫 dummyMethod() 函式。

例子:

public class ExampleClass3 {
  public static void main(String[] args) {
    DummyClass.InnerClass dummyClassObj = new DummyClass.InnerClass();
    dummyClassObj.dummyMethod();
  }
}

class DummyClass {
  static class InnerClass {
    void dummyMethod() {
      System.out.println("Inside Static Dummy Method Of The Inner Static Class");
    }
  }
}

輸出:

Inside Static Dummy Method Of The Inner Static Class

Java 中的 final 變數

最終變數一旦初始化就不能修改。該示例表明,如果我們建立一個最終變數,然後嘗試重新初始化它,我們會在輸出中得到一個錯誤。

public class ExampleClass3 {
  public static void main(String[] args) {
    final int num = 0;
    num = 1;
  }
}

輸出:

java: cannot assign a value to final variable num

另一個類不能擴充套件 final 類。在建立類時使用 final 關鍵字會限制該類被任何其他類繼承。

例子:

public class ExampleClass3 {
  public static void main(String[] args) {
    new DummyClass().dummyMethod();
  }
}

final class DummyClass {
  public void dummyMethod() {
    System.out.println("Inside Static Dummy Method");
  }
}

class DummyClass2 extends DummyClass {
  public void dummyMethod2() {
    System.out.println("Inside Static Dummy Method 2");
  }
}

輸出:

java: cannot inherit from final com.tutorial.DummyClass

我們不能覆蓋子類中的 final 方法。像 final 類一樣,如果函式使用 final 關鍵字,它不能被其子類覆蓋。

public class ExampleClass3 {
  public static void main(String[] args) {
    new DummyClass2().dummyMethod();
  }
}

class DummyClass {
  public final void dummyMethod() {
    System.out.println("Inside Static Dummy Method");
  }
}

class DummyClass2 extends DummyClass {
  public void dummyMethod() {
    System.out.println("Inside Overridden Dummy Method");
  }
}

輸出:

java: dummyMethod() in com.tutorial.DummyClass2 cannot override dummyMethod() in com.tutorial.DummyClass
 overridden method is final