# Static & Private Constructor
###### tags: `Java` `Basic Java`
當一個class中的method經常會被使用到的時候,就會將其method全部加上static修飾
以方便別的class使用
Example: 製作一個可以求最大值與最小值的陣列工具
```
public class ArrayTools {
public int getMax(int[] array) {
int max = array[0];
for (int i = 0; i < array.length; i++) {
if (array[i] > max) {
max = array[i];
}
}
return max;
}
public int getMin(int[] array) {
int min = array[0];
for(int i = 0; i < array.length; i++) {
if (array[i] < min) {
min = array[i];
}
}
return min;
}
}
```
如果要使用這些method,就得先將這個class實例化
```
ArrayTools tools = new ArrayTools();
```
這樣做太麻煩了,所以就把全部的method前面都加上static修飾
在程式加載的同時,這些方法也會同時載入heap memory中的靜態區
故main method進入stack的時候就可以直接訪問這些method並取用
完整如下
```
public class ArrayTools {
public static int getMax(int[] array) {
int max = array[0];
for (int i = 0; i < array.length; i++) {
if (array[i] > max) {
max = array[i];
}
}
return max;
}
public static int getMin(int[] array) {
int min = array[0];
for(int i = 0; i < array.length; i++) {
if (array[i] < min) {
min = array[i];
}
}
return min;
}
}
```
這樣就不用再創建物件,可以直接用classname.method的語句使用這些方法
```
public static void main(String[] args) {
int[] array = {11, 22, 33};
System.out.println(ArrayTools.getMax(array)); // will print out 33
System.out.println(ArrayTools.getMin(array)); // will print out 11
}
```
## 但是要注意一點!!!
由於這種tool-like的class(裡面都是靜態方法的類)拿來建立物件是沒有甚麼意義的
**所以通常會將constructor進行private修飾,防止別人拿來new**
```
private ArrayTools() {
}
```
加完private後要再另外的class進行實例創建時就會出錯
```
public class Test {
ArrayTools tools = new ArrayTools(); // compiling error!!!!
}
```
類似的寫法舉例:Java API中的System Class裡面寫的方法全部都是static
並且將constructor也加上private了
以上筆記