java – 为什么在使用带有类名的静态变量时未显示非法的前向引用错误
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 为什么在使用带有类名的静态变量时未显示非法的前向引用错误,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1659字,纯文字阅读大概需要3分钟。
内容图文
![java – 为什么在使用带有类名的静态变量时未显示非法的前向引用错误](/upload/InfoBanner/zyjiaocheng/818/59666736a4594f4887b2e39fc2e7ff0f.jpg)
在使用类名访问静态变量时,在下面的代码中,它不会引发前向引用错误,但是在没有类名的情况下访问它.
为什么在使用类名访问时不会发生这种情况?
class Test{
static {
System.out.println(a); // shows error
a = 99; // and this line too doesn't give error
System.out.println(Test.a); // this line doesn't
}
static int a = 10;
static{
System.out.println(a);
}
}
解决方法:
前向引用规则在JLS §8.3.3中定义:
Use of class variables whose declarations appear textually after the
use is sometimes restricted, even though these class variables are in
scope (§6.3). Specifically, it is a compile-time error if all of the
following are true:
The declaration of a class variable in a class or interface C appears
textually after a use of the class variable;The use is a simple name in either a class variable initializer of C
or a static initializer of C;The use is not on the left hand side of an assignment;
C is the innermost class or interface enclosing the use.
所以,基本上你的第一个Sysout()满足所有上述4个条件,因此它是一个编译时错误.
在第二个Sysout()中,您正在访问使用它的限定名称,而不是简单名称,根据上述规则允许.
现在,原因是,当您访问Test.a时,编译器确保已加载Test类并且已初始化所有静态字段,因此它可以访问字段a.但是在访问简单名称时,编译器不确定a的初始化程序是否已经运行,因为它可能仍在处理加载类.
考虑以下加载类的过程:
>加载类时,将为其中声明的所有静态变量分配内存.此时,变量a已分配其内存(声明已完成)
>然后所有静态初始化程序按发生顺序运行.
>第一个陈述是Sysout(a);. a尚未初始化,因此您无法访问它. (错误)
>第二个语句是a = 99.这里你实际上是在初始化变量a.非常好.
>第三个是Sysout(Test.a) – 对此的推理已在上面发布.编译器知道Test已经加载.
>然后执行static int a = 10.它重新初始化为10.记住,声明部分已经在第一步处理.
内容总结
以上是互联网集市为您收集整理的java – 为什么在使用带有类名的静态变量时未显示非法的前向引用错误全部内容,希望文章能够帮你解决java – 为什么在使用带有类名的静态变量时未显示非法的前向引用错误所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。