Hiện tại tôi đang làm việc trên tối ưu hóa mã nơi tôi đang sử dụng thử .. cuối cùng khối để deference đối tượng của tôi.Làm thế nào cố gắng ... cuối cùng làm việc nội bộ
Nhưng tôi đã nhầm lẫn rằng cách trả về một đối tượng được quản lý khi tôi tạo tham chiếu null cho một đối tượng trong khối cuối cùng của mình. ??
Trong khi trả về một đối tượng trong khối thử, nó sẽ tạo ra một câu lệnh được biên dịch trước khi biên dịch? hoặc tạo tham chiếu mới trong heap trong khi nói đến câu lệnh return? hoặc chỉ trả về một tham chiếu hiện tại của một đối tượng?
Dưới đây là mã nghiên cứu của tôi.
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());
}
}
Output là:
Bên trong khối try
đang Hash của str: -832.992.604
ở cuối cùng trước khi bolck
trong khối finally sau
nhắn: Hello world
đang Hash của tin nhắn: -832992604
Tôi rất ngạc nhiên khi thấy cả đối tượng quay lại và đối tượng gọi có cùng mã băm. Vì vậy, tôi nhầm lẫn về tham chiếu đối tượng.
Hãy giúp tôi xóa nội dung cơ bản này.
mã băm được tạo dựa trên nội dung chứ không phải địa chỉ tham chiếu hoặc thứ gì đó. Vậy sự nhầm lẫn là gì? – SMA
Cảm ơn bạn đã trả lời nhanh chóng. sự nhầm lẫn của tôi là tôi đang làm cho đối tượng của tôi null trong khối cuối cùng của tôi. Vì vậy, nơi đối tượng trở lại là cư trú và làm thế nào ?? – Pratik
[JLS-14.20.2. Thực thi 'try-finally' và' try-catch-finally'] (https://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.20.2) có thể giúp xóa bỏ sự nhầm lẫn của bạn về 'cuối cùng'. Điều quan trọng cần lưu ý là Java 'String' là không thay đổi. Vì vậy, bạn đã trả lại một bản sao của giá trị đó, bạn không thể sửa đổi thể hiện được trả về cuối cùng. Nếu bạn trả về một 'StringBuilder' và được gọi là' setLength (0) 'ở cuối cùng thì bạn sẽ nhận được một độ dài bằng không' StringBuilder' trong người gọi của bạn. –