Java中final與 static final 修飾的常量的區別
喵喵開車,新手上路,多多關照。有任何錯誤請在評論區指出。
...........................................我是萬惡的分界線( ? ?ω?? )?.........................................
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 修飾的常量的區別