噢 我想應該是 美食界之於小松 一樣吧 (就體能論..)
anyway, 就是想把一些我認為介於初~中級之間,甚或是我認為需要重新筆記整理的觀念,都記錄起來
好不容易找到一篇還滿淺顯易懂的文章,不然看著一面面的Thinking in Java還真是無所適從呢..
<<以下來自 Ken Yang 筆記 >>
從很久以前我就了解到,
不僅僅要知道know how, 還要知道know why,
舉個例子,當我派工作給底下的人做時,
例如要他做出一個發送mail的功能出來,
恩,拜Google大神所賜,通常很快都可以找到發送mail的code。
但是當我細下去問每一行code的用途時, 大多是...."恩...不知道"。
我覺得此風不可長。
甚至有些學弟們搞不清楚何時要用static、final。
也不懂甚麼是interface、abstract等等之類的。
因為他們也不知道這些東西的作用。
所以用這篇文章來稍微解說一下。
static:
靜態的意思 可以用來宣告一個函數或者變數,
只要記得當一個函數或者變數被宣告為static時, 他就具有唯一值的概念!!
他就永遠只佔著那一組記憶體空間。 不管該類別被new幾個object,該值永遠都會是一樣的!
舉個例子!
我們看到下面code的例子
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裡面分別去new兩個object出來。 分別是test1, test2,
然後先印出test1的iValue出來,(印出0,當然!一開始是0)
接著我們用test2這個object去將iValue設值設為10,
接著再去印出test2的iValue出來,(印出10出來,當然!因為設成10了阿)
重點來了!
這時候再印出test1的iValue出來!
大部分的人會覺得,應該是印出0阿, 但是印出的是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)
static的介紹大概到這, 接著介紹final
final:
相較於static,final的概念就容易了解許多!
可以用來宣告一個類別、函數、或者變數。
類別:當宣告在類別上時,該類別就無法被繼承!
函數:當一個函數被宣告為final時,則繼承他的子類別無法覆寫
變數:當一個變數被宣告為final時,意思是他是一個常數,是無法被修改的。
注意!
使用static final需要注意一點!!
如上面所述說的,當我們有一個常數要宣告時, 會宣告如下
public static final String strValue = "ken";為什麼宣告這樣會有個風險呢? 因為java在進行compile的時候, 會將宣告成static final的變數,直接包進去程式裡面。 什麼意思呢?
System.out.println(strValue);當你有類似存取strValue的code時,
我們去把java會把compile成的class,
decompile來看 會發現它變成如下的code
System.out.println("ken");
好啊好啊,那到底風險又在哪?當然啦,
如果你今天有用一些好用的IDE進行開發, 應該是不會遇到這樣的風險,
以Eclipse為例,只要你一儲存或者執行,Eclipse就會幫你進行compile!
(如果有勾選Build Automatically的話)
可是如果你今天是徒法煉鋼!
自己下指令進行compile的時候... 又剛好你程式改了,
把strValue的值改為"yang", 又剛好你忘記進行compile....
這時候...如果有人去存取strValue就會出錯!!
那怎麼解決??? 我們可以利用static block來進行宣告的動作!!! 如下:
static String strValue;
static{
strValue = "ken";
}
如果用這樣的宣告方式,即可避免上面述說的問題!原諒我,太累了。
今天就先講解static,final 基本概念
下篇在講解interface, abstract!!
不過我沒翻到「下篇」就是了@@
沒有留言:
張貼留言