首页 / JAVA / 为什么java静态变量没有更新?
为什么java静态变量没有更新?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了为什么java静态变量没有更新?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2133字,纯文字阅读大概需要4分钟。
内容图文
![为什么java静态变量没有更新?](/upload/InfoBanner/zyjiaocheng/806/c9b8fb85355c4b44992dcd949ab30f11.jpg)
我有一个名为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
解决方法:
加载并链接类时,其静态字段全部初始化为其默认值.完成后,静态字段初始化程序按它们在文件中出现的顺序执行,从而完成类的初始化.所有这些都发生在该类中定义的任何代码执行之前.那么这里发生的是:
> RED,GREEN,BLUE和i初始化为默认值(Color字段为null,i为0).请注意,这与任何初始值设定项无关.
>执行字段RED(RED = new Color())的初始化程序.作为副作用,i增加到1.
>字段BLUE的初始化程序执行,i增加到2.
>字段GREEN的初始化程序执行,i增加到3.
>执行静态字段的初始化程序,并为i赋值0.
>当main()开始执行时,main()方法执行并生成与i为0的结果.
你可以在Chapter 12 of the Java Language Specification (JLS)和Chapter 5 of the Java Virtual Machine Specification阅读所有这些的血腥细节.
只需将i的声明移到Color字段之前,就可以获得预期的输出:
static int i=0;
public static Color RED = new Color();
public static final Color BLUE = new Color();
public static final Color GREEN = new Color();
然后输出将是:
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: 3
Incrementing ‘i’ here 4
4
请注意,最终修饰符对此处的初始化顺序没有影响,因为根据JLS中该术语的定义,GREEN和BLUE不是“常量变量”.常量变量(不幸的单词配对)是一个原始或String变量,它们都被声明为final并初始化为常量表达式.在这种情况下,new Color()不是常量表达式,Color不是常量变量的合适类型.例如,见§4.12.4 of the JLS.
内容总结
以上是互联网集市为您收集整理的为什么java静态变量没有更新?全部内容,希望文章能够帮你解决为什么java静态变量没有更新?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。