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

Поведение оператора return в catch и, наконец,

public class J {

     public Integer method(Integer x) 
        {
            Integer val = x;
            try 
            {

                    return val;
            } 
            finally 
            {
                     val = x + x;
            }
        }
        public static void main(String[] args) 
        {
            J littleFuzzy = new J();
            System.out.println(littleFuzzy.method(new Integer(10)));
        }

}

Он вернет "10".

Теперь я просто заменяю тип возвращаемого значения Integer на StringBuilder, и результат был изменен.

public class I {

     public StringBuilder method(StringBuilder x) 
        {
            StringBuilder val = x;
            try 
            {

                    return val;
            } 
            finally 
            {
                     val = x.append("aaa");
            }
        }
        public static void main(String[] args) 
        {
            I littleFuzzy = new I();
            System.out.println(littleFuzzy.method(new StringBuilder("abc")));
        }


}

OutPut - это "abcaaa"

Итак, кто-нибудь может объяснить мне подробно.? каковы различия.?

4b9b3361

Ответ 1

Просто потому, что целое число в immutable, поэтому после возврата метода, даже если значение изменено в методе, оно не отражается и отражается в StringBuilder Object

EDIT:

public class J {
    public String method(String x) {
        String val = x;
        try {
            return val;
        } finally {
            val = x + x;
        }
    }

    public static void main(String[] args) {
        J littleFuzzy = new J();
        System.out.println(littleFuzzy.method("abc"));
    }
}

Ответ 2

Основными операциями в StringBuilder являются методы добавления и вставки, которые перегружены, чтобы принимать данные любого типа. Каждый из них эффективно преобразует данную дату в строку, а затем добавляет или вставляет символы этой строки в построитель строк. Метод append всегда добавляет эти символы в конец построителя; метод insert добавляет символы в указанной точке.

Например, если z ссылается на объект строкового построителя, текущее содержимое которого "запускается", тогда вызов метода z.append( "le" ) заставит построитель строк содержать "startle", тогда как z.insert( 4, "le" ) изменит строковый конструктор, содержащий "звездочку".

В общем случае, если sb ссылается на экземпляр StringBuilder, то sb.append(x) имеет тот же эффект, что и sb.insert(sb.length(), x). Каждый построитель строк имеет емкость. Пока длина символьной последовательности, содержащейся в построителе строк, не превышает емкость, нет необходимости выделять новый внутренний буфер. Если внутренний буфер переполняется, он автоматически становится больше.

Экземпляры StringBuilder небезопасны для использования несколькими потоками. Если такая синхронизация требуется, рекомендуется использовать StringBuffer.

В вышеприведенном методе, наконец, блок вызывает каждый раз.

Ответ 3

Когда объект передается, копия его ссылки передается, и вы можете изменить содержимое, если оно изменено.