---
# System prepended metadata

title: Static & Private Constructor
tags: [Java, Basic Java]

---

# 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了

以上筆記
