为了账号安全,请及时绑定邮箱和手机立即绑定

为什么Java静态变量没有更新?

为什么Java静态变量没有更新?

慕标5832272 2021-05-14 18:17:51
我有一个称为Color的类,其中有三个静态对象(使用同一类本身实例化)和一个int类型(称为i)变量。当我运行类时,“ i”变量在构造函数中为增量,但未持久存储在内存中,请在下面的代码中对此进行解释package test;public class Color{     public static  Color RED = new Color();     public static final Color BLUE = new Color();     public static final Color GREEN = new Color();     static int i=0;     Color(){         System.out.println("Incrementing 'i'  here  "+(++i));     }     public static void main(String[] args) {         System.out.println("The 'i' variable is not incremented here, it still shows '0' ,  'i' is: "+ Color.i );  // line 14         Color x = new Color();        System.out.println(x.i);    }}内容如下:Incrementing 'i'  here  1Incrementing 'i'  here  2Incrementing 'i'  here  3The 'i' variable is not incremented here, it still shows '0' ,  'i' is: 0Incrementing 'i'  here  11
查看完整描述

2 回答

?
白衣染霜花

TA贡献1796条经验 获得超10个赞

类初始化从上到下进行。当初始化Color时,我们创建了一个新的Color。为了创建新的Color,我们还必须初始化Color。这就是所谓的递归初始化,而系统所做的就是简单地忽略递归初始化并执行new Color()。此类初始化程序按以下顺序从上到下执行

  1. public static  Color RED = new Color(); 这会将静态变量i设置为1。

  2. public static final Color BLUE = new Color(); 这将静态变量i增加到2

  3. public static final Color GREEN = new Color(); 这将静态变量i增加到3

  4. static int i=0; 这会将静态变量i设置为零。

现在,当主线程运行时,它看到static变量为0并递增为1。

作为反例,请尝试将替换static int i=0static Integer i=new Integer(0).。这将引发一个NullPointerException。这是因为在类初始化时,在public static  Color RED = new Color();执行时它将i视为null,因为那时i尚未初始化,导致NullPointerException


查看完整回答
反对 回复 2021-05-19
  • 2 回答
  • 0 关注
  • 274 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信