# 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了 以上筆記