在类A中声明: public static final int i =10; //访问A.a时不会触发A的初始化
public static final A a = null; //访问A.a时触发了A的初始化?
访问static final常量时均不应该触发类的初始化才对?
相关问题:static final常量和static变量均在编译阶段存放在方法区中,为什么调用static变量会触发初始化,调用static final常量不会触发初始化?
写错了 - -
第一行是 访问A.i不会触发A的初始化
希望能从JVM的原理上找到答案 - -
static变量是在类加载的时候初始化
static final常量是对象实例化的时候初始化
public class StaticAndFinalTest {private static Random rand = new Random(47); //47作为随机种子,为的就是产生随机数。
private final int a = rand.nextInt(20);
private static final int B = rand.nextInt(20);
public static void main(String[] args) {
StaticAndFinalTest sf = new StaticAndFinalTest();
System.out.println("sf : " + "a=" + sf.a);
System.out.println("sf : " + "B=" + sf.B);
System.out.println("------------------------------");
StaticAndFinalTest sf1 = new StaticAndFinalTest();
System.out.println("sf1 : " + "a=" + sf1.a);
System.out.println("sf1 : " + "B=" + sf1.B);
}
}
运行结果:
sf : a=15
sf : B=18
--------------
sf1 : a=13
sf1 : B=18
可以看到,在sf和sf1对象中,a的值不是唯一的,但B的值是不会通过创建sf1对象而改变。这是因为它是static,在装载时已被初始化,而不是每次创建新对象时都初始化。
追问你证明的单独使用final和static的区别,我问的时static final和static的区别 - -!
而且我的问题是 同样是被static final修饰,为什么基本数据类型被访问时不会触发所属类的初始化,而引用类型会触发;
static加上去也是这样的
温馨提示:答案为网友推荐,仅供参考
第1个回答 2017-02-01
static变量初始值一定要是常量。 static变量中文名叫静态变量。它与普通的变量比起来有如下几个区别: 1)位置:静态局部变量被编译器放在全局存储区.data,所以它虽然是局部的,但是在程序的整个生命周期中存在。
第2个回答 2015-09-10
因为常量是不可变的,设置了常量的属性或方法,系统不再会为它提供初始化服务,是给予程序猿自己来设施初始化值的。而没有设置常量的属性或者方法的话,那么系统会默认给他附初始化值
第3个回答 2015-09-10
和static变yuofyip