Я видел несколько примеров Java, которые используют ключевое слово this
, чтобы получить методы суперкласса. Пример: this.superClassMethod()
. В обычном случае мы использовали бы super
. Может ли кто-нибудь помочь пояснить пример, почему разработчик использовал this
вместо super
? Спасибо.Зачем использовать это ключевое слово для получения методов суперкласса
ответ
Там нет никакой разницы между и 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 для краткого ключевого оператора «нет разницы между this.method() и super.method(), пока указанный метод не будет переопределен в классе вызывающего». – TheBlastOne
Все это верно, но может быть сокращено до: Если вы хотите вызвать суперкласс, используйте 'super', иначе ничего не делайте по умолчанию (без использования' this') всегда будет использоваться «самая последняя реализация». –
Спасибо человеку. Наконец то я понял – gjman2
Использование this
не вызывает метод суперкласса. Это на самом деле лишнее, потому что он специально вызывает метод этого экземпляра. Это может быть актуально, если вы хотите вызвать другой конструктор одного и того же экземпляра, но в остальном это то же самое, что просто вызвать метод.
Это может быть полезно для области изменения переменных (например, если есть локальная переменная с тем же именем, что и переменная экземпляра), чтобы убедиться, что используется переменная экземпляра, но при вызове методов это не имеет никакого значения.
Лично я думаю, что разработчик хочет, чтобы воспользоваться функцией автозавершения кода и IDE показывает возможные имена методов после ввода this.
:-)
@ TheBlastOne Что? –
Неправильный слот: 0 извините – TheBlastOne
ОК, я сначала смутился :-D –
супер используются для доступа к методам базового класса, в то время как этот используется для доступа к методам текущего класса.
Несколько ссылок
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(), он бы напечатался как «собака: есть».
Этот код использует код 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, это может быть на более поздний срок, поэтому его будущее будет готово. До тех пор, пока метод не будет переопределен, он отлично работает, и если он перевернут, он будет точным.
Так что я считаю, что это соглашение о кодировании лучшей практики для ясности. Это не повредит код, так как не писать - это только синтаксический сахар, и компилятор добавит его в код класса.
- 1. Зачем использовать ключевое слово void?
- 2. Зачем использовать ключевое слово `transient` в java?
- 3. Зачем использовать это ключевое слово в функции конструктора
- 4. Зачем использовать абстрактное ключевое слово в Julia?
- 5. Зачем использовать клон ключевое слово здесь
- 6. Зачем использовать ключевое слово global в C#?
- 7. Зачем использовать ключевое слово «для» для привязки метки в HTML?
- 8. , обрабатывающий это ключевое слово
- 9. общедоступное ключевое слово для нескольких методов/членов
- 10. Зачем мне нужно использовать ключевое слово [open] для запуска mysql
- 11. Зачем использовать ключевое слово "inline" для активного шаблона?
- 12. Зачем всегда нужно использовать ключевое слово extends перед тем, как использовать ключевое слово?
- 13. Go «это» -ключевое слово
- 14. Когда НЕ ИСПОЛЬЗОВАТЬ «это» ключевое слово?
- 15. Java - когда использовать ключевое слово «это»
- 16. Понимание «это» ключевое слово
- 17. Зачем использовать ключевое слово "typename" для следующего определения?
- 18. Почему здесь нельзя использовать это ключевое слово?
- 19. java это ключевое слово
- 20. Что это за ключевое слово?
- 21. Зачем мне нужно использовать ключевое слово «this» для вызова моих закрытых методов или переменных
- 22. Как использовать ключевое слово "select" для получения параметров по конвейеру?
- 23. это ключевое слово в Js
- 24. Как свойства класса доступа из методов, использующих это ключевое слово
- 25. это ключевое слово и статический
- 26. Это ключевое слово в классах
- 27. это ключевое слово вместо event.target?
- 28. Class.create и это ключевое слово
- 29. Ключевое слово DEFAULT Transact-SQL устарело? Зачем?
- 30. «это» ключевое слово в функции
Является ли метод переопределенным в подклассе? – 2013-04-17 14:33:12