可以用來宣告一個函數或者變數,當一個函數或者變數被宣告為static時,
就具有唯一值的概念。此函數或變數永遠只佔著一組記憶體空間。不管該類別被new幾個object,
該值永遠都會是一樣的。
class test{ static int iValue = 0; public test() { } } public class main { public static void main(String[] argv) { test test1 = new test(); test test2 = new test(); System.out.println(test1.iValue); test2.iValue = 10; System.out.println(test2.iValue); System.out.println(test1.iValue); } }當test這個類別裡的資料成員iValue被宣告為static型態,
在main function裡面分別去new兩個object出來。 分別是test1, test2,
先印出test1的iValue出來(印出0,初始值是0),
接著我們在test2這個object去將iValue設值設為10,
再去印出test2的iValue出來(此時會印出10),
這時候再印出test1的iValue出來會發現印出的是10。
原因是因為我們將iValue宣告成static了。而iValue成為一個共同的變數。
這就是static 的一個特性,
特性一:永遠會是一個唯一值!
且static 還有一個特性,
特性二:static可以透過類別直接存取使用!
意思是我們其實不需要new 一個object出來。
也可以透過類別直接去存取該變數
class test{ static int iValue = 0; public test() { } } public class main { public static void main(String[] argv) { System.out.println(test.iValue); } }在main中,並沒有new一個object出來,也可以存取到test這個類別中的資料成員(iValue)
final: 相較於static,final的概念就容易了解許多。
可以用來宣告一個類別、函數、或者變數。
類別:當宣告在類別上時,該類別就無法被繼承。
函數:當一個函數被宣告為final時,則繼承他的子類別無法覆寫
變數:當一個變數被宣告為final時,意思是他是一個常數,是無法被修改的。
使用static final需要注意一點,如上面所述說的,當我們有一個常數要宣告時,
會宣告如下
public static final String strValue = "abc";
為什麼宣告這樣會有個風險呢?
因為java在進行compile的時候, 會將宣告成static final的變數,直接包進去程式裡面。
System.out.println(strValue);
當你有類似存取strValue的code時,我們去把java會把compile成的class,decompile來看,
會發現它變成如下的code
System.out.println("abc");
風險在於若不是用易除邊譯除錯的IDE來寫程式,
有可能會誤將strValue的值改為"123"或其他值, 若忘了重新compile,
有其他物件去存取strValue就會發生錯誤。
我們可以利用static block來進行宣告的動作,如下:
static String strValue; static{ strValue = "abc"; }
如果用這樣的宣告方式,即可避免上面述說的問題!
沒有留言:
張貼留言