1. 程式人生 > >Java中final與 static final 修飾的常量的區別

Java中final與 static final 修飾的常量的區別

評論 tin 產生 建立 dom code 隨機數 ren 使用

喵喵開車,新手上路,多多關照。有任何錯誤請在評論區指出。

...........................................我是萬惡的分界線( ? ?ω?? )?.........................................

final:用來修飾類,變量,方法:

final修飾的類不能有子類,也不能被繼承。

final修飾的變量是一個常量,不能重新賦值。

final修飾的方法不能重寫

現在就說明final修飾的常量① 與 static final 修飾的常量② 的區別。

例如:

① final long CURRENT_TIME=system.currentMillis();

② static final long CURRENT_TIME=system.currentMillis();

不使用static修飾:

如果建立常量時直接賦一個固定值,那麽這個常量的值是固定不變的,即多個對象中的值也是相同的。如果建立常量時是采用函數或對象,那麽每次建立對象時給其常量的初始化值就有可能不同。所以,只使用final的Java常量定義並不是恒定的。

使用static修飾:

在創建對象之前就會為這個變量在內存中創建一個存儲空間,以後創建對象如果需要用到這個靜態變量,那麽就會共享這一個變量的存儲空間。

不太明白的話,下面是代碼示例(轉載自http://advance0683.iteye.com/blog/1107732)

 1 import java.util.Random;
 2 
 3 //這個例子想說明一下static final 與 final的區別
 4 public class StaticAndFinalTest {
 5     
 6     private static Random rand = new Random(47); //47作為隨機種子,為的就是產生隨機數。
 7     
 8     private final int a = rand.nextInt(20);
 9     
10     private static final int B = rand.nextInt(20);
11 12 public static void main(String[] args) { 13 StaticAndFinalTest sf = new StaticAndFinalTest(); 14 System.out.println("sf : " + "a=" + sf.a); 15 System.out.println("sf : " + "B=" + sf.B); 16 System.out.println("------------------------------"); 17 StaticAndFinalTest sf1 = new StaticAndFinalTest(); 18 System.out.println("sf1 : " + "a=" + sf1.a); 19 System.out.println("sf1 : " + "B=" + sf1.B); 20 } 21 22 }

下面是代碼結果:

sf : a=15

sf : B=18

--------

sf1 : a=13

sf1 : B=18

可以看到,在sf和sf1對象中,a的值不是唯一的,但B的值是不會通過創建sf1對象而改變。

這與上文所述是一致的。

( ? ?ω?? )?

Java中final與 static final 修飾的常量的區別