小编典典

为什么此Java转换会引发错误?

java

我想知道为什么在引用“ w”之后obj = w;会引发错误。您不是通过说obj =
w来创建另一个指向该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 
   }
}

阅读 168

收藏
2020-11-30

共1个答案

小编典典

没有什么比早上引用JLS更重要。

JLS 6.3。宣言的范围:

块中的局部变量声明的范围(第14.4节)是该声明在其中出现的其余部分,从其自身的初始化程序开始,并在局部变量声明语句的右侧包括其他任何声明符。

JLS 14.2 方块:

是语句,局部类声明,并且括号内的局部变量声明的语句序列。

在您的情况下意味着什么?局部变量w在块中声明

{ 
    Stopwatch w = new Stopwatch();
    obj = w;
}

(“自己的初始化程序”是该块的第一行),因此它的作用域是该块的其余部分。对它的引用

System.out.println(w);

在代码块之外,因此w将无法解析为变量。

那局部变量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可以成功引用。

2020-11-30