# 什麼是靜態 (Static) 在Java中,static關鍵字可用來修飾屬性、方法和類別。 在屬性、方法或類別前面加上關鍵字「static」,就是告訴Java編譯器,遇到static修飾的東西,就要優先分配記憶體空間給它。 要更深入了解static的意義,要搭配「全域變數和局部變數」的觀念一起看。static修飾的東西就相當於全域變數,在程式的進入點main()方法「之前」就會被分配到記憶體空間,並且不會在執行完一段敘述之後就釋放出記憶體空間,除非程式結束,都會保留著static的資料,所以也有「共享」的功能。 比較有加static跟沒有加static修飾的差異,決定性的不同是「載入記憶體的時機」。static關鍵字修飾的東西,在程式的進入點main()方法「之前」就會被分配到記憶體,並且在整個程式的執行期間都不會釋放掉static資料的記憶體空間,所以才稱為靜態。 可以被宣告成靜態(前面加上static關鍵字)的東西有屬性、方法和類別。不過只建議使用靜態類別,原因以下詳述: 一、靜態屬性(static property): 我們可以不要用static修飾一整個類別,而可以只修飾類別中的某一個屬性(成員變數)。存取的方式是: 類別名稱 . 靜態屬性 ; 就像我們存取一般物件的屬性一樣,是透過「.」運算子來存取,但靜態屬性要使用類別名稱去存取,而不是物件名稱。 二、靜態方法(static methods): 我們可以不要用static修飾一整個類別,而可以只修飾類別中的某一個方法(成員函數)。存取的方式是: 類別名稱 . 靜態方法 ; 就像我們存取一般物件的方法一樣,是透過「.」運算子來存取,但靜態方法要使用類別名稱去存取,而不是物件名稱。 不過建議,盡量少宣告靜態屬性和靜態方法,因為我們知道static修飾的屬性或方法有「共享」的特性,在整個程式結束之前都不會釋放掉它所佔用的記憶體空間,就像我們宣告全域變數一樣,會很難掌控全域資料的變化,所以會經常發生很難除錯的bug。 還有一個很大的問題,宣告成靜態屬性或靜態方法的東西,會經常混淆到底要用類別名稱去存取?還是用物件名稱去存取?所以「不建議」把類別成員宣告成靜態屬性或靜態方法。 三、靜態類別(static class): 顧名思義,就是在程式的進入點main()方法,以及做實體化建立物件(new + 建構子)「之前」,就給它分配記憶體空間的類別,所以靜態類別不需要實體化就能用,我們就能以「類別名稱 . 屬性」和「類別名稱 . 方法()」的方式來存取靜態類別的屬性或呼叫(執行)方法。 注意,因為靜態類別已經在一開始就被分配到記憶體空間,所以靜態類別不能再以new + 建構子實體化了,這樣就相當於重複分配記憶體空間,會發生編譯錯誤。