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