Вызов метода экземпляра с "этим" против вызова без "этого" - есть ли разница?

Есть ли разница между звонком 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() метод) одинаковы и разницы нет.

Другие вопросы по тегам