我是java的新手,我对正向引用有一个疑问。正向引用是对尚未初始化的变量的引用。但是当我们在方法中执行此操作时,错误的类型会有所不同吗?实际上,我的问题是,当我们在方法中使用另一个变量初始化变量时,这是否是引用的用法?
public static void main(String[] args) {
int total=number + 10;
int number;
错误是:
Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - cannot find symbol
symbol: variable number
没有方法:
class Person
{
int total=number + 10;
int number;
错误是:
Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - illegal forward reference
答案 0 :(得分:1)
这是关于scope(强调):
- 块中的局部变量声明的范围(第14.4节)是出现声明的块的其余部分,该声明从其自己的初始化程序开始,并在其中包含右侧的任何其他声明符局部变量声明语句。
和
- 在类类型C中声明或继承的成员m的声明的范围(第8.1.6节)是C的整个主体,包括任何嵌套的类型声明。
在第一种情况下,您要声明一个局部变量number
,因此您只能在声明后 处引用它(但即使那样,您也只能读取一次它)已明确分配)。如果尝试在声明变量之前引用该变量,则好像该变量不存在(因此“找不到符号”)。
在第二种情况下,您要声明一个成员变量,因此您可以在类中的任何位置引用它,包括在声明之前 。
答案 1 :(得分:-1)
前向引用不适用于局部变量。适用的是确定分配。 Section 16 of the JLS对此进行了说明。
对于每次访问局部变量或空白最终字段
x
,必须在访问之前明确分配x
,否则会发生编译时错误。 >
在您的情况下,number
必须先明确分配int total = number + 10
,然后{{1}}才能访问它,这说明了为什么会出现编译时错误。