2013-04-17 3 views
5

Я видел несколько примеров Java, которые используют ключевое слово this, чтобы получить методы суперкласса. Пример: this.superClassMethod(). В обычном случае мы использовали бы super. Может ли кто-нибудь помочь пояснить пример, почему разработчик использовал this вместо super? Спасибо.Зачем использовать это ключевое слово для получения методов суперкласса

+0

Является ли метод переопределенным в подклассе? – 2013-04-17 14:33:12

ответ

17

Там нет никакой разницы между и super.method() до указанного method() получает переопределен в классе вызывающего абонента.

Например, с

class SuperClass { 

    public void method() { 
     System.out.println("SuperClass"); 
    } 

} 

class SubClass extends SuperClass { 

    public SubClass() { 
     method(); 
     this.method(); 
     super.method(); 
    } 

} 

Calling

new SubClass(); 

Печать

SuperClass 
SuperClass 
SuperClass 

В то время как с

class SuperClass { 

    public void method() { 
     System.out.println("SuperClass"); 
    } 

} 

class SubClass extends SuperClass { 

    @Override 
    public void method() { 
     System.out.println("SubClass"); 
    } 

    public SubClass() { 
     method(); 
     this.method(); 
     super.method(); 
    } 

} 

Вызов

new SubClass(); 

Печать

SubClass 
SubClass 
SuperClass 

Параллельно, нет никакой разницы между this.field и super.field до указанного field получает скрытой в классе вызывающего абонента.

Например, с

class SuperClass { 

    protected String field = "SuperClass"; 

} 

class SubClass extends SuperClass { 

    public SubClass(String field) { 
     System.out.println(field); 
     System.out.println(this.field); 
     System.out.println(super.field); 
    } 

} 

Calling

new SubClass("parameter"); 

Печать

parameter 
SuperClass 
SuperClass 

В то время как с

class SuperClass { 

    protected String field = "SuperClass"; 

} 

class SubClass extends SuperClass { 

    private String field = "SubClass"; 

    public SubClass(String field) { 
     System.out.println(field); 
     System.out.println(this.field); 
     System.out.println(super.field); 
    } 

} 

Вызывающие

new SubClass("parameter"); 

Печать

parameter 
SubClass 
SuperClass 

Боковая примечание: methods()получить перекрываться в то время как fields получить скрытые.

+1

+1 для краткого ключевого оператора «нет разницы между this.method() и super.method(), пока указанный метод не будет переопределен в классе вызывающего». – TheBlastOne

+4

Все это верно, но может быть сокращено до: Если вы хотите вызвать суперкласс, используйте 'super', иначе ничего не делайте по умолчанию (без использования' this') всегда будет использоваться «самая последняя реализация». –

+0

Спасибо человеку. Наконец то я понял – gjman2

5

Использование this не вызывает метод суперкласса. Это на самом деле лишнее, потому что он специально вызывает метод этого экземпляра. Это может быть актуально, если вы хотите вызвать другой конструктор одного и того же экземпляра, но в остальном это то же самое, что просто вызвать метод.

Это может быть полезно для области изменения переменных (например, если есть локальная переменная с тем же именем, что и переменная экземпляра), чтобы убедиться, что используется переменная экземпляра, но при вызове методов это не имеет никакого значения.

Лично я думаю, что разработчик хочет, чтобы воспользоваться функцией автозавершения кода и IDE показывает возможные имена методов после ввода this. :-)

+0

@ TheBlastOne Что? –

+0

Неправильный слот: 0 извините – TheBlastOne

+0

ОК, я сначала смутился :-D –

3

супер используются для доступа к методам базового класса, в то время как этот используется для доступа к методам текущего класса.

Несколько ссылок
1) usage of this
2) critique on super on SO

Расширяя понятие, если вы пишете супер(), он относится к конструктору базового класса, и если вы пишете это(), это относится к конструктору самого класса, в котором вы пишете этот код.

class Animal { 
    void eat() { 
    System.out.println("animal : eat"); 
    } 
} 

class Dog extends Animal { 
    void eat() { 
    System.out.println("dog : eat"); 
    } 
    void anotherEat() { 
    super.eat(); 
    } 
} 

public class Test { 
    public static void main(String[] args) { 
    Animal a = new Animal(); 
    a.eat(); 
    Dog d = new Dog(); 
    d.eat(); 
    d.anotherEat(); 
    } 
} 

Выход будет

animal : eat 
dog : eat 
animal : eat 

Третья линия печати "животное: есть", потому что мы называем super.eat(). Если бы мы назвали this.eat(), он бы напечатался как «собака: есть».

+0

Ссылка «критика на супер» фактически относится конкретно к вызову 'super()' от конструктора, а не к общему понятию вызова 'super. '. – rob

+0

Почему бы вам не добавить последний пример, упомянутый в классе 'Test' и выходе? ;) – rob

0

Этот код использует код oracle/sun java. когда это не нужно, например увидеть Java \ AWT \ Event.java #translate

public void translate(int dx, int dy) { 
    this.x += dx; 
    this.y +=  
} 

(если вы извлекаете src.zip и поиск для этого. в * .java увидит много примеров, как это, где есть нет переопределяющей локальной переменной/param, но все же они используют этот стиль.

Ничего общего с параметрами или автозавершением (просто x) Я думаю, что это стандарт кодирования, чтобы было ясно, что мы говорим о методе или поле в текущий/этот класс.

Метод базового класса: Даже если еще не пройденный в нашей группе ss, это может быть на более поздний срок, поэтому его будущее будет готово. До тех пор, пока метод не будет переопределен, он отлично работает, и если он перевернут, он будет точным.

Так что я считаю, что это соглашение о кодировании лучшей практики для ясности. Это не повредит код, так как не писать - это только синтаксический сахар, и компилятор добавит его в код класса.

Смежные вопросы