避免Illegal forward reference 非法向前引用

昨天在工作中遇到了一个异常 :Illegal forward reference
产生这种异常的根本原因也很清晰:就是引用了一个未初始化的变量

需要了解一下java的运行原理, 抄《深入理解java虚拟机》书中,关于类初始化章节中提到的一句话: 静态语句块中只能访问到定义在静态语句块之前的变量,定义在它之后的变量,在前面的静态语句块中可以赋值,但是不能访问。
这是因为类的初始化过程中, 静态代码块和静态变量是按编写顺序进行初始化的
示例:

public class MyClass {
	static {
		i = 0; //给变量赋值可以正常通过
		System.out.println(i); //编译器提示非法向前引用
	}
	static int i = 1;
}

以上转载自:https://blog.csdn.net/xdugucc/article/details/78239920, https://blog.csdn.net/hsz2568952354/article/details/97496917
========================================================================

我在实际工作中遇到的情况是 正在初始化的静态内部类中,引用了非静态内部类, 并且非静态内部类是写在静态内部类下边的, 将非静态内部类调整到静态内部类上边就OK了。

上面博客已经描述的很清晰了,最后精华的一句话 “就是对于有初始值的变量,要避免在初始化之前访问变量的默认值。但是赋值确是可以的,因为最终变量还是会进行初始化”
我也就再举举例子加深印象:

NG
private int i = j;
private int j = i;

NG
{
	System.out.println(i)
}
int i;

OK(赋值可以,引用不可以)
{
	i = 1234;
}
int i;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值