目前我正在进行代码优化,我正在使用try .. finally阻止我的对象。
但是我很困惑,当我在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());
}
}
输出是:
内部尝试块
str的哈希码:-832992604
在最后鲍尔之前 在最后一次阻止之后 消息:你好世界
消息的哈希码:-832992604
当我看到返回对象和调用对象具有相同的哈希码时,我感到非常惊讶。 所以我对对象引用感到困惑。
请帮我清楚这个根本。
答案 0 :(得分:12)
该方法不会完全返回对象。它返回对象的引用。那个对象 reference是指在方法调用的内部和外部保持相同。因为它是同一个对象,所以 hashcode将是相同的。
str
时return str
的值是对“Hello World”字符串的引用。回报
语句读取str
的值并将其保存为方法的返回值。
然后运行finally块,它有机会通过包含它自己来改变返回值
退货声明。更改finally块中str
的值不会更改已设置的值
返回值,只有另一个return语句。
由于将str
设置为null
无效,您可以删除此类语句。一旦方法返回,它就会超出范围,因此它对垃圾收集没有帮助。
答案 1 :(得分:1)
基于JLS 14.20.2 Execution of try-catch-finally
If execution of the try block completes normally, then the finally block is executed, and then there is a choice: If the finally block completes normally, then the try statement completes normally. If the finally block completes abruptly for reason S, then the try statement completes abruptly for reason S.
希望这有帮助:)
答案 2 :(得分:0)
Hashcode()不用于显示引用。相反,哈希码用于检查2个字符串是否彼此相等。请参阅http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#hashCode()
返回此字符串的哈希码。 String对象的哈希码计算为 s [0] * 31 ^(n-1)+ s [1] * 31 ^(n-2)+ ... + s [n-1]
由于两个String具有相同的值,因此哈希码当然是相同的。