Подтвердить что ты не робот

Как попробовать... наконец работает внутри

В настоящее время я работаю над оптимизацией кода, где я использую 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 Block
Хэш-код str: -832992604
в конце концов в окончательном блоке после
Сообщение: Hello world
Хэш-код сообщения: -832992604

Я очень удивлен, когда вижу, что возвращающий объект и вызывающий объект имеют один и тот же хэш-код. Поэтому я смущен ссылкой на ссылку на объект.

Пожалуйста, помогите мне очистить это фундаментальное.

4b9b3361

Ответ 1

Метод точно не возвращает объект. Он возвращает ссылку на объект. Объект, согласно которому ссылка ссылается на то же самое внутри и снаружи вызова метода. Поскольку это тот же объект, hashcode будет таким же.

Значение str во время return str является ссылкой на строку "Hello World". Возврат оператор считывает значение str и сохраняет его как возвращаемое значение метода.

Затем выполняется блок finally, который имеет возможность изменить возвращаемое значение с помощью его собственного return. Изменение значения str в блоке finally не изменяет уже установленный возвращаемое значение, будет только другой оператор возврата.

Поскольку настройка str - null не действует, вы можете удалить такие утверждения. Он исчезнет из области действия, как только метод вернется в любом случае, поэтому он не поможет в сборе мусора.

Ответ 2

База на JLS 14.20.2 Выполнение 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.

Надеюсь, что эта помощь:)

Ответ 3

Hashcode() не предназначен для показа ссылки. Вместо этого используется hashcode, чтобы проверить, соответствуют ли две строки друг другу. См. 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]

Поскольку обе строки имеют одно и то же значение, конечно же, хэш-код является одним и тем же.