什麼是靜態變數?

靜態變數或類別變數在類別的所有實例之間共享,並且可以在不建立類別實例的情況下存取和修改。讓我們深入了解Java中 靜態變數的使用和實作。

Java中的靜態變數範例

靜態變數最常見的用途之一是在類別的所有實例之間共用。例如,追蹤創建的實例數量的計數器變量,或保存永不更改的值的CONSTANT變量。考慮一個代表銀行帳戶的類別。以下程式碼片段顯示如何使用 靜態變數nextAccountNumber為每個新帳戶指派唯一的帳號:

例子

// BankAccount class definition
class BankAccount {
  // Declare static variable nextAccountNumber
  static int nextAccountNumber = 1001;

  // Declare instance variables for accountNumber and balance.
  int accountNumber;
  double balance;

  // BankAccount constructor that assigns unique account number to each instance
  BankAccount() {
    // Assign the current value of nextAccountNumber to accountNumber.
    accountNumber = nextAccountNumber;

    // Increment nextAccountNumber for the next BankAccount object.
    nextAccountNumber++;
  }

  // Method to get the account number of this BankAccount object.
  int getAccountNumber() {
    return accountNumber;
  }

  // Method to get the balance of this BankAccount object.
  double getBalance() {
    return balance;
  }

  // Method to deposit an amount into this BankAccount object.
  void deposit(double amount) {
    // Increase balance by the amount deposited.
    balance += amount;
  }

  // Method to withdraw an amount from this BankAccount object.
  void withdraw(double amount) {
    // Decrease balance by the amount withdrawn.
    balance -= amount;
  }
}

// Main method definition
class Main {
  static void main(String[] args) {
    // Create three BankAccount objects: account1, account2, and account3.
    BankAccount account1 = new BankAccount();
    BankAccount account2 = new BankAccount();
    BankAccount account3 = new BankAccount();

    // Display the value of the static variable nextAccountNumber after creating each BankAccount object.
    System.out.println("Value of nextAccountNumber after creating account1: " + account1.getAccountNumber());
    System.out.println("Value of nextAccountNumber after creating account2: " + account2.getAccountNumber());
    System.out.println("Value of nextAccountNumber after creating account3: " + account3.getAccountNumber());
  }
}

輸出

建立 account1 後 nextAccountNumber 的值: 1001 建立 account2 後 nextAccountNumber 的值: 1002 建立 account3 後 nextAccountNumber 的值: 1003
在此範例中,main 方法建立BankAccount類別的三個實例。BankAccount建構子將nextAccountNumber指派給新帳戶,並將nextAccountNumber變數加 1. getAccountNumber方法傳回每個帳戶帳號。然後,main 方法列印出每個帳戶的帳號和nextAccountNumber變數。您可以看到每個帳號都是唯一的,並且對於每個建立的新帳戶, nextAccountNumber變數都會增加 1。 靜態變數也可以用來實作單例設計模式,其中只能建立一個類別的一個實例。單例類是一種在任何Java應用程式中只能有一個實例的類,同時提供對此實例的全域存取點。以下程式碼片段顯示如何使用 靜態變數實例來實作單例類別:

例子

public class Singleton {
    // using static variable in the singleton class
    private static Singleton instance;
    private Singleton() { }

    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }

    public void displayMessage() {
        System.out.println("This is a singleton class");
    }

    public static void main(String[] args) {
        Singleton singleton1 = Singleton.getInstance();
        singleton1.displayMessage();

        Singleton singleton2 = Singleton.getInstance();
        singleton2.displayMessage();

        Singleton singleton3 = Singleton.getInstance();
        singleton3.displayMessage();
    }
}

輸出

這是一個單例類 這是一個單例類 這是一個單例類
在此範例中,main方法透過呼叫getInstance()方法來建立Singleton類別的三個實例。getInstance ()方法傳回類別的實例,如果不存在則建立一個新實例。displayMessage方法只是列印一則訊息。然後main方法為每個實例呼叫displayMessage方法。正如您所看到的,即使我們建立了三個實例,也只建立了一個物件並在所有實例之間共用。它證明只有該類別的一個實例被創建並在所有實例之間共享,並且靜態變數“instance”被保存。請務必記住,靜態變數的值在類別的所有實例之間共享,因此一個實例對變數所做的變更將對所有其他實例可見。應仔細考慮靜態變量,以避免程式碼中潛在的衝突和錯誤。例如,不建議使用靜態變數來保存特定於類別實例的值(例如帳戶餘額)。 為了鞏固您所學到的知識,我們建議您觀看我們的 Java 課程中的影片課程

結論

總而言之, Java 中的靜態變數允許在類別的所有實例之間共享資料。它們可用於在所有實例之間共享的變量,例如計數器和常數,或用於實現單例設計模式。但是,請務必記住,靜態變數的值在類別的所有實例之間共享,因此一個實例對變數所做的變更將對所有其他實例可見。