3/04/2012

[轉錄] Java static,final 基本概念

java之於我就像是美食界之於特瑞柯一樣
噢 我想應該是 美食界之於小松 一樣吧 (就體能論..)
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!!

不過我沒翻到「下篇」就是了@@

沒有留言:

張貼留言