(转载自http://blog.kenyang.net/2011/03/java-staticfinal.html)
從很久以前我就了解到,
不僅僅要知道know how,
還要知道know why,
舉個例子,當我派工作給底下的人做時,
例如要他做出一個發送mail的功能出來,
恩,拜Google大神所賜,通常很快都可以找到發送mail的code。
但是當我細下去問每一行code的用途時,
大多是...."恩...不知道"。
我覺得此風不可長。
甚至有些學弟們搞不清楚何時要用static、final。
也不懂甚麼是interface、abstract等等之類的。
因為他們也不知道這些東西的作用。
所以用這篇文章來稍微解說一下。
static:
靜態的意思
可以用來宣告一個函數或者變數,
只要記得當一個函數或者變數被宣告為static時,
他就具有唯一值的概念!!
他就永遠只佔著那一組記憶體空間。
不管該類別被new幾個object,該值永遠都會是一樣的!
舉個例子!
我們看到下面code的例子
我們把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出來。
也可以透過類別直接去存取該變數
例子如下!
你會發現在main中,我們並沒有new一個object出來!!
也可以存取到test這個類別中的資料成員(iValue)
static的介紹大概到這,
接著介紹final
final:
相較於static,final的概念就容易了解許多!
可以用來宣告一個類別、函數、或者變數。
類別:當宣告在類別上時,該類別就無法被繼承!
函數:當一個函數被宣告為final時,則繼承他的子類別無法覆寫
變數:當一個變數被宣告為final時,意思是他是一個常數,是無法被修改的。
注意!
使用static final需要注意一點!!
如上面所述說的,當我們有一個常數要宣告時,
會宣告如下
為什麼宣告這樣會有個風險呢?
因為java在進行compile的時候,
會將宣告成static final的變數,直接包進去程式裡面。
什麼意思呢?
當你有類似存取strValue的code時,
我們去把java會把compile成的class,decompile來看
會發現它變成如下的code
好啊好啊,那到底風險又在哪?
當然啦,如果你今天有用一些好用的IDE進行開發,
應該是不會遇到這樣的風險,
以Eclipse為例,只要你一儲存或者執行,Eclipse就會幫你進行compile!
(如果有勾選Build Automatically的話)
可是如果你今天是徒法煉鋼!
自己下指令進行compile的時候...
又剛好你程式改了,把strValue的值改為"yang",
又剛好你忘記進行compile....
這時候...如果有人去存取strValue就會出錯!!
那怎麼解決???
我們可以利用static block來進行宣告的動作!!!
如下:
如果用這樣的宣告方式,即可避免上面述說的問題!
原諒我,太累了。
今天就先講解static,final 基本概念
下篇在講解interface, abstract!!
不僅僅要知道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!!