猿问

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

我有一个称为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  1

Incrementing 'i'  here  2

Incrementing 'i'  here  3

The 'i' variable is not incremented here, it still shows '0' ,  'i' is: 0

Incrementing 'i'  here  1

1


慕标5832272
浏览 275回答 2
2回答

白衣染霜花

类初始化从上到下进行。当初始化Color时,我们创建了一个新的Color。为了创建新的Color,我们还必须初始化Color。这就是所谓的递归初始化,而系统所做的就是简单地忽略递归初始化并执行new Color()。此类初始化程序按以下顺序从上到下执行public static  Color RED = new Color(); 这会将静态变量i设置为1。public static final Color BLUE = new Color(); 这将静态变量i增加到2public static final Color GREEN = new Color(); 这将静态变量i增加到3static int i=0; 这会将静态变量i设置为零。现在,当主线程运行时,它看到static变量为0并递增为1。作为反例,请尝试将替换static int i=0为static Integer i=new Integer(0).。这将引发一个NullPointerException。这是因为在类初始化时,在public static  Color RED = new Color();执行时它将i视为null,因为那时i尚未初始化,导致NullPointerException
随时随地看视频慕课网APP

相关分类

Java
我要回答