Вызов метода экземпляра с "этим" против вызова без "этого" - есть ли разница?
Есть ли разница между звонком getName()
в строке 8 и в строке 9.
Если да, то что это?
Это может быть очень просто, но я сделал свой поиск в Google, и единственный результат, который я получил, был об использовании this
с полем, а не с методом.
class CallingInstanceMethodWithAndWithoutThis {
private String getName() {
return "Zarah";
}
private void printGetName() {
System.out.println(getName());
System.out.println(this.getName());
}
public static void main(String [] args) {
new CallingInstanceMethodWithAndWithoutThis().printGetName();
}
}
3 ответа
Нет никакой разницы, это всего лишь соглашение о кодировании. Более того, вы можете попросить Eclipse, например, автоматически удалить "this", когда это не нужно для сохранения.
Для компилятора разницы нет, но в некоторых случаях это может привести к коллизиям. Как правило, не используя this
все будет в порядке, компилятор Java достаточно умен, чтобы признать наши намерения, но настоятельно рекомендуется использовать this
в любом случае, ключевое слово (например, в установщиках), IMO более понятно, откуда берется метод (в случае, если ваш класс расширяет другой или вы импортируете некоторые методы статически).
Там нет разницы между использованием this
и не использовать его.
Чтобы проверить это, на самом деле, если мы выполняем дизассемблирование с помощью javap -p -c CallingInstanceMethodWithAndWithoutThis
выход ниже:
private void printGetName();
Code:
0: getstatic #19 // Field java/lang/System.out:Ljava/io/PrintStream;
3: aload_0
4: invokespecial #25 // Method getName:()Ljava/lang/String;
7: invokevirtual #27 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
10: getstatic #19 // Field java/lang/System.out:Ljava/io/PrintStream;
13: aload_0
14: invokespecial #25 // Method getName:()Ljava/lang/String;
17: invokevirtual #27 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
Мы можем заметить, что вывод в строке 0 и строке 10 (где мы вызываем getName()
метод) одинаковы и разницы нет.