3
回答
谁说final修饰的常量不可以修改

如图啊,为什么会出现这种情况,这样bb就被改变了啊。

<无标签>
举报

我觉得你应该看看类加载机制,jvm加载你的类的时候对bb初始化赋的值,你对main方法里面new的Test对象试试看你还能赋值?

静态变量是先加载的,它加载时还没有加载构造方法,所以第一次为null,然后你创建对象了,就调用构造方法,这时候就不为空了,你下次再new Test()就不会变了

  1. private static final String bb = new Test().ss; 是Test类定义中的静态代码(块)。
  2. Java中的静态代码块是在虚拟机加载类的时候,就执行的,而且只执行一次。
  3. 执行这行代码,调用 Test 类的无参数(默认)的构造方法 Test() 先于 给 静态常量字符串(static final String) bb  赋值 ( 换句话说,第一次调用 Test() 在先,给 bb 赋值在后)。
  4. 显然,此刻(第一次调用默认构造方法时),bb 指空。故输出 bb=null。
  5. 当主方法(驱动方法 public static void main(String args[]) 再调用 Test 类的默认构造方法时,bb 已经在虚拟机加载类的时候,被赋予 成员变量 ss 的值"123"。故输出 bb=123。
  6. 此后,由于 bb 被冠以 final,任何时候,它都不允许被改动。
顶部