目前我正在代码优化,我正在使用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'。 –