2016-02-15 3 views
0

Есть ли разница между вызовом на номер getName() в строке 8 и на линии 9.Вызов метода экземпляра с «этим» против его вызова без «этого» - есть ли разница?

Если да, то что это такое?

Это может быть очень просто, но я выполнил поиск в Google, и только SO result, я получил около 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(); 
    } 

} 
+4

Нет никакой разницы. – Satya

+1

Вы в основном включили дубликат своего вопроса в свой вопрос. Ответ тот же. –

+0

@pp_ Я упоминал, почему это не точный дубликат. Это о полях. Это о методах. – Solace

ответ

1

Нет никакой разницы, это просто соглашение о кодировании. Кроме того, вы можете попросить Eclipse, например, автоматически удалить «это», когда это не требуется в качестве действия «Сохранить действие».

1

Для компилятора нет никакой разницы, но это может привести к столкновениям в некоторых случаях. Как правило, не используется this, java-компилятор достаточно умен, чтобы распознать наши намерения, но в любом случае настоятельно рекомендуется использовать ключевое слово this (например, в сеттерах), IMO - это более понятно, чтобы понять, откуда приходит этот метод (в случае, если ваш класс extends other или вы импортируете некоторые методы статически).

1

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