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对象而改变。

这与上文所述是一致的。

( • ̀ω•́ )✧

猜你喜欢

转载自www.cnblogs.com/dingruihfut/p/9096226.html