目前我正在代碼優化,我正在使用try ..終於阻止尊重我的對象。如何嘗試...終於內部工作
但我有困惑,如何返回一個對象的管理,當我在我的finally塊創建一個對象的空引用。 ??
在try塊中返回一個對象時,它會在編譯期間創建一個預編譯的語句嗎?或者在返回語句時在堆中創建新的引用?或者只是返回一個對象的當前引用?
以下是我的研究代碼。
public class testingFinally{
public static String getMessage(){
String str = "";
try{
str = "Hello world";
System.out.println("Inside Try Block");
System.out.println("Hash code of str : "+str.hashCode());
return str;
}
finally {
System.out.println("in finally block before");
str = null;
System.out.println("in finally block after");
}
}
public static void main(String a[]){
String message = getMessage();
System.out.println("Message : "+message);
System.out.println("Hash code of message : "+message.hashCode());
}
}
輸出是:
內部try塊
海峽的 哈希碼:-832992604
在
前最後bolck後
消息finally塊:你好世界
哈希碼消息:-832992604
當我看到返回對象和調用對象具有相同的哈希碼時,我感到非常驚訝。 所以我對對象引用感到困惑。
請幫我清楚這個基本。
哈希碼是根據內容創建的,而不是引用地址或其他內容。那混淆是什麼? – SMA
感謝您的及時回覆。我的困惑是我在我的finally塊中讓我的對象爲null。所以返回對象駐留在哪裏? – Pratik
[JLS-14.20.2。執行'try-finally'和'try-catch-finally'](https://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.20.2)可能會有助於清除你對「終於」的困惑。重要的是要注意Java'String'是不可變的。所以你已經返回了這個值的副本,你不能在最後修改返回的實例。如果你在finally中返回了一個'StringBuilder'並且調用了'setLength(0)',那麼你的調用者會得到一個零長度的'StringBuilder'。 –