我想知道为什么在引用“ w”之后obj = w;会引发错误。您不是通过说obj = w来创建另一个指向该w实例的指针吗?也就是说,为什么与说String s = "hi"; String w = s;谢谢一样呢?
obj = w;
String s = "hi"; String w = s;
public class Casting { public static void main(String[] args) { // casting doesn't change the object Object obj; { Stopwatch w = new Stopwatch(); obj = w; } System.out.println(obj); // this line does work System.out.println(w); //this line does not work } }
没有什么比早上引用JLS更重要。
JLS 6.3。宣言的范围: 块中的局部变量声明的范围(第14.4节)是该声明在其中出现的其余部分,从其自身的初始化程序开始,并在局部变量声明语句的右侧包括其他任何声明符。
JLS 6.3。宣言的范围:
块中的局部变量声明的范围(第14.4节)是该声明在其中出现的其余部分,从其自身的初始化程序开始,并在局部变量声明语句的右侧包括其他任何声明符。
和
JLS 14.2 方块: 阿 块 是语句,局部类声明,并且括号内的局部变量声明的语句序列。
JLS 14.2 方块:
阿 块 是语句,局部类声明,并且括号内的局部变量声明的语句序列。
在您的情况下意味着什么?局部变量w在块中声明
w
{ Stopwatch w = new Stopwatch(); obj = w; }
(“自己的初始化程序”是该块的第一行),因此它的作用域是该块的其余部分。对它的引用
System.out.println(w);
在代码块之外,因此w将无法解析为变量。
那局部变量obj呢?它在块中声明
obj
public static void main(String[] args) { Object obj; { Stopwatch w = new Stopwatch(); obj = w; } System.out.println(obj); System.out.println(w); }
在这种情况下是一个方法块。通话
System.out.println(obj);
在块内,因此obj可以成功引用。