Java static,final 基本概念

(转载自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的例子

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!!
原文地址:https://www.cnblogs.com/zt1175576678/p/4023894.html