Java中final static变量初始化的问题

在类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

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网