Java: это.foo() и супер.foo () то же самое, когда foo() находится в супер классе?
скажем, у меня есть следующие классы:
class Foo {
protected void method() {}
}
class Bar extends Foo {
}
на данный момент, из панели классов, у меня есть доступ к method()
двумя способами:
super.method();
this.method();
из того, что я вижу, они, кажется, выполняют одно и то же действие. Есть ли разница между этими двумя в данном контексте? Есть ли предпочтительная версия для использования, если да?
используя super
имеет смысл, потому что method()
является частью суперкласса. Используя this
имеет смысл тоже я полагаю, так как Bar унаследует свойства класса Foo, и поэтому method()
Как хорошо, да?
2 ответов
да this.foo()
вызывает тот же метод, как super.foo()
.
обратите внимание, что будет разница, если foo()
переопределяется в дочернем классе. Но в этом случае выполняется та же реализация метода.
мы используем:super.foo()
когда нам нужно конкретно запросить выполнение реализации метода суперкласса, когда есть один доступный в текущем классе.
использование super имеет смысл, потому что метод () является частью super класс!--9-->
да, но помните, что дочерний класс может изменить в какой-то момент и получить переопределенную foo()
в этом случае super.foo()
может начать вызывать непреднамеренную реализацию.
это то, что нужно знать. По этой причине звоню this.foo()
, или неквалифицированный foo()
может быть оправдано.
просто имейте в виду, что ребенок может быть переопределен еще раз:
public class Main {
static class Foo {
protected void method() {
System.out.println("Bye");
}
}
static class Bar extends Foo {
{
this.method();
super.method();
}
}
static class Baz extends Bar {
protected void method() {
System.out.println("Hi");
}
}
public static void main(String[] args) {
new Baz();
}
}
выдает:
Hi
Bye
, хотя this.method()
и super.method()
может вести себя одинаково в некоторых случаях, они не производят один и тот же байт-код.