1. 程式人生 > >java回顧篇——static和非static的區別

java回顧篇——static和非static的區別

關於static和非static變數的區別。

1. static 修飾的變數稱為類變數或全域性變數或成員變數,在類被載入的時候成員變數即被初始化,與類關聯,只要類存在,static變數就存在。非static修飾的成員變數是在物件new出來的時候劃分儲存空間,是與具體的物件繫結的,該成員變數僅為當前物件所擁有的。

2. static修飾的變數在載入的時候先於main方法載入在記憶體中的資料共享區-------方法區,而非static的變數在載入的時候,是要建立變數才載入在堆記憶體中的。

3. 一個static變數單獨劃分一塊儲存空間,不與具體的物件繫結在一起,該儲存空間被類的各個物件所共享。static變數值在方法區載入一次,而非static在建立物件時會載入很多次。每次建立都會拷貝一份。
4. 物件在引用成員變數是直接通過類名.變數名呼叫,物件在引用例項變數時只能通過物件名.變數名呼叫。

5. 在類中呼叫成員變數時直接呼叫或者以類名.變數名方式呼叫,例項變數則用this或者直接呼叫。

關於static方法和非static方法的區別

1. static修飾的方法也和static一樣。先於main方法被載入到方法區,以便共享使用。

2. 靜態的static方法中不能使用this或者super關鍵字,因為static方法是先於物件建立之前就已經載入的方法,是屬於類的方法,而this和super指向的是本類的物件或者父類的物件,非靜態的方法是屬於物件的,方法裡可以用this和super。

3. static方法可以用物件.方法名來呼叫,也可以用類名.方法名來呼叫。而非靜態的方法只能建立物件後時呼叫。

4. static方法是載入一次,被所有的物件所共享。而非靜態方法是有多少個物件就拷貝多少次,每個物件只能呼叫自己的拷貝的方法。

5. 物件呼叫非靜態的方法時,不考慮執行緒安全性的問題,而呼叫靜態方法時,要考慮安全性的問題。因為靜態方法只有一份。而物件的方法是自己有自己的。

6. 同一個類中,靜態方法中只能訪問類中的靜態成員。而非靜態方法可以訪問非靜態的方法(使用類名呼叫,或者創建立本類的物件呼叫)。