Там нет практически никакой разницы. В первом примере создается новая локальная переменная, а во втором - нет. Вот и все.
Чтобы заглянуть под капот немного и проверить, что, давайте рассмотрим этот простой класс с двумя методами, которые делают по существу то, что вы делаете в вашем примере:
public class Downcasts {
public int stringLength1(Object o) {
String s = (String) o;
return s.length();
}
public int stringLength2(Object o) {
return ((String) o).length();
}
}
Байткод для этих методов (которые вы можете увидеть javap -c Downcasts
) являются:
public int stringLength1(java.lang.Object);
Code:
0: aload_1
1: checkcast #2 // class java/lang/String
4: astore_2
5: aload_2
6: invokevirtual #3 // Method java/lang/String.length:()I
9: ireturn
public int stringLength2(java.lang.Object);
Code:
0: aload_1
1: checkcast #2 // class java/lang/String
4: invokevirtual #3 // Method java/lang/String.length:()I
7: ireturn
Первый метод делает эти вещи:
String s = (String) o
:
- грузы
o
в стек
- проверяет, что это строка
- магазинов, в регистр 2
return s.length()
:
- грузов регистр 2 в стек (это один мы только что сохранили)
- вызывает
String::length
(виртуальная функция) на нем
- возвращает результат
Второй метод делает:
return ((String) o).length()
:
- нагрузки
o
в стек
- проверяет, что это строка
- вызывает
String::length
(виртуальная функция ции) на нем
- возвращает результат
Это то же самое.Второй пример - просто вызвать метод непосредственно после литья объекта, хранящегося в переменной –
Если вы вызываете метод на aVar, вы получите тот же результат ... Если вам не нужен aVar для других операций, вы можете использовать второй пример. –