Java中final与 static final 修饰的常量的区别
Posted dingruihfut
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 修饰的常量的区别的主要内容,如果未能解决你的问题,请参考以下文章
Java中final与 static final 修饰的常量的区别
java 怎样动态修改 private static final int 值