簡體   English   中英

為什么此Java轉換會引發錯誤?

[英]Why does this Java casting throw an error?

我想知道為什么在obj = w;之后引用“ w” obj = w; 會拋出一個錯誤。 您不是通過說obj = w來創建另一個指向該w實例的指針嗎? 即為什么與說String s = "hi"; String w = s;String s = "hi"; String w = s;東西有所不同String s = "hi"; String w = s; 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 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

這是范圍的問題。

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

這里的w范圍在圓括號內,並且該變量在外部不可用。因此這里沒有賦值問題,但該問題與范圍有關,可以通過以下方法輕松解決

public class Casting {    public static void main(String[] args) {
  // casting doesn't change the object
   String w;
  Object obj;
  { 
      w = new String();
      obj = w;
  }
  System.out.println(obj); // this line does work
  System.out.println(w); //this line now working     } }

變量w在塊內聲明,因此在塊外不存在。 這個問題與鑄造無關。 刪除括號,它將起作用:

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);
      System.out.println(w);
   }
}

就像在其他答案中提到的那樣,刪除括號即可。 如果要保留小節,也可以執行以下操作。 實際上,在java中,變量具有作用域,可以在聲明該變量的作用域中使用一個變量。 就像在“ if”塊或“ try”塊中聲明一些變量一樣,它只能在該范圍內使用。 這有助於有效的垃圾收集。 總是最好在最小所需范圍內定義變量。但是,如果要在某處創建某個對象,但又想在該部分(塊)之后使用它,則在塊外聲明(不需要創建對象的變量)。

public class Casting {
public static void main(String[] args) {
  // casting doesn't change the object
   Object obj;
  Stopwatch w ;
  { 
      w = new Stopwatch();
      obj = w;
  }
  System.out.println(obj); // this line does work
  System.out.println(w); //this line does not work 
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM