[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;
```