---
# System prepended metadata

title: static (Class Members)
tags: [Java]

---

[toc]

https://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html

# static

有static修飾的Members為Class Members
無static修飾的Members為Instance Members

## static field

當你建立物件的時候, 像是之前的Point
每個Point物件都有自己的x, y field的值。

有時候, 你希望每個物件都共享同一個field。
此時, 把Field設為static即可。

也可稱為Class Variable, 因為對於一個static field而言, 不管class有多少個實例, 他永遠只有一個值, 那就是與class有關連, 與物件沒有關聯。

因此, 不需要物件就可以存取static field。
non static field反之。

---

Example: 每個Point共享一個pointCount值
```java
class Point {
    public static int pointCount = 0;
    private int x;
    private int y;
    // ...
}
```
---
### 存取

- `Class.staticFieldName` 
在Class外 / 或是在class內,但是區域變數衝突可用
- `staticFieldName`
在Class內使用
- `objectReference.staticFieldName` 
(強烈不建議, 因為這樣不好辨認field是不是static)

```java
class Point {
    public static int pointCount = 0;
    
    private int x;
    private int y;
    
    public Point(int x, int y) {
        this.x = x;
        this.y = y;
        pointCount++; // 在class內可以直接使用staticFieldName
    }
    
    void something() {
        int pointCount = -1;
        
        // 區域變數衝突
        int count = Point.pointCount;
    }
    // ...
}
public class Main {
    public static void main(String[] args) {
        int count = Point.pointCount; // 正常在Class外使用
        
        // 強烈不建議, 因為這樣不好辨認field是不是static
        Point p = new Point();
        int count = p.pointCount;  
    }
}
```

## static method

不需要物件就可以呼叫static method。
non static method反之。
### 存取
- `ClassName.methodName(args)`
在Class外使用
- `methodName(args)`
在Class內使用
- `objectReference.methodName(args)`
(強烈不建議, 因為這樣不好辨認method是不是static)
```java=
class Test {
    public static int k = 3;
    
    public static void print() {
        System.out.println("Hello");
    }
    
    public static void test() {
        print(); // 在Class內使用
    }
}
public class Main {
    public static void main(String[] args) {
        Test.print(); // 在Class外使用
        
        Test t = new Test();
        t.print(); // 強烈不建議    
    }
}
```

## Constant
`static` + `final` 用於定義常數。
```java
static final double PI = 3.141592653589793;
static final int MAX_VALUE = 2147483647;
```