# 靜態變數

> 了解利用static關鍵字修飾變數時的程式意義，以及相關使用方式。

在前一篇我們知道用static修飾的成員，在程式載入時會一起載入記憶體，但在Java的程式裡面又代表什麼意義呢？

從物件導向的觀點去看物件的資料欄位：

```java
class Human{
  Sring name;
  int age;
  int height;
  Human(String str){
    name=str;
  }// end of constructor(String)
}// end of class Human
```

這個類別叫Human裡面有3個欄位，分別紀錄該物件的姓名、年齡及身高。

創造物件：

```java
Human tina = new Human("小婷");
Human yubin = new Human("小木");
```

記憶體配置： ![](/files/-MLRnl9TRPeTsODwR8gY)

此時各個物件擁有的資料欄位彼此獨立，佔用不同記憶體空間，互不干涉。

我們知道在Human裡面定義的資料欄位(name, age, height)是屬於『物件』的。創造物件後，每個物件都有自己的資料欄位。

但如果我希望有一個欄位可以『**全部物件共同擁有**』呢？

例如：希望能有一個變數，紀錄總共的人數。

那很明顯，這個變數不應該屬於『某個物件』，而是屬於『類別』。

```java
class Human{
    static int total = 0;  // 紀錄總人數
    Sring name;
    int age;
    int height;
    Human(String str){
        name=str;
        total++;  // 每建立一個Human物件，即對總人數+1
    }// end of constructor(String)
}// end of class Human
```

創造物件：

```java
class Test{
  public static void main(String[] args){
      Human tina = new Human("小婷");
      System.out.println("目前人數："+Human.total);
      Human yubin = new Human("小木");
      System.out.println("目前人數："+Human.total);
  }// end of main(String[])
}// end of class Test
```

執行結果：

```java
目前人數：1
目前人數：2
```

記憶體配置：

![](/files/-MLRnl9Uw4eo3ZGYW-7F)

與一般物件成員不同，static成員是屬於類別，也就是所謂『**類別成員**』。

## 存取方式：

```java
類別名稱 . 靜態成員 ;
```

就像我們存取一般物件的變數一樣，透過點運算子，但因為靜態成員是屬於類別所以要用類別名稱去存取。

## 題外話

存取靜態成員的方式其實更加自由，以上述寫的Human類別為例：

```java
class Test{
  public static void main(String[] args){
      Human tina = new Human("小婷");
      Human yubin = new Human("小木");
      System.out.println(Human.total);
      System.out.println(tina.total);
      System.out.println(yubin.total);
  }// end of main(String[])
}// end of class Test
```

輸出結果：

```java
2
2
2
```

從程式中看到，物件tina跟物件yubin，都可以透過點運算子對total這個類別成員進行存取。這是沒問題的，因為tina、yubin都是Human類別，相當於透過Human去存取。

但&#x662F;**『非常不建議』**&#x9019;種寫法，寫程式要考慮到程式的可讀性，類別成員就用類別名稱去存取，物件成員就用物件名稱去存取，讀程式的人才不會造成混淆。

甚至有些人以為類別成員一定要用類別名稱存取(害我被扣分還要去跟老師要分數)，因此考慮到對Java不熟的人可能會看你的程式，還是照著建議的方式撰寫(Java建議寫法)。

以上述例子來看，要存取 total，就應該用類別名稱去存取：

```java
System.out.println(Human.total);
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://yubin551.gitbook.io/java-note/basic_java_programming/reservedwordstatic/staticvariables.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
