В чем разница между class.super.method и class.method?
Хотя обе версии приведенного ниже кода работают, мне интересно, какой из них является "более правильным"/"стандартным" подходом и почему. Благодарю.
Версия 1:
public class SomeClass extends OtherClass{
public boolean someMethod() {
ActionListener s = new ActionListener() {
public void actionPerformed(ActionEvent evt) {
SomeClass.super.method();
}
};
}
}
Версия 2:
public class SomeClass extends OtherClass{
public boolean someMethod() {
ActionListener s = new ActionListener() {
public void actionPerformed(ActionEvent evt) {
SomeClass.method();
}
};
}
}
Другими словами...
SomeClass.method();
или же SomeClass.super.method();
Точно так же, когда я должен использовать method()
и когда я должен использовать super.method()
?
Большое спасибо.
2 ответа
Они не являются "более правильными"/"стандартными", оба вызова методов имеют совершенно разное значение, так как они вызывают разные методы:
SomeClass.method()
; метод вызовов method()
из SomeClass
(и метод () должен быть объявлен как статический, чтобы он работал)
SomeClass.super.method();
метод вызовов method()
из OtherClass
,
Точно так же используйте method()
позвонить method()
определены в данной области, super.method()
если вы хотите вызвать реализацию класса родителя (даже если method()
переопределено в подклассе).
method()
в вашем коде, кажется, статический метод на вашем OtherClass
,
В общем, чтобы всем, кто читает ваш код, было ясно, что вы вызываете статический метод для класса в иерархии вашего объекта, вы можете добавить префикс вызова к имени класса: OtherClass.method()
(как обсуждено в этом ответе)
Если вы не переопределяете статический method()
в вашем подклассе обычно вызывается метод родительского класса просто с method()
или явно с OtherClass.method()
, как уже упоминалось выше. Вам не нужно ставить перед вызовом префикс super.
,
Если вы переопределяете статический method()
в вашем подклассе, затем вызывая method()
или же SomeClass.method()
из вашего SomeClass
будет иметь тот же эффект вызова статического метода, определенного в SomeClass
,
Если вы хотите вызвать статический метод родительского класса, который скрыт, потому что ваш подкласс переопределяет его, вы можете либо вызвать super.method()
(если вы находитесь в прямом подклассе, который переопределяет его), или снова откровенно об этом и используйте OtherClass.method()
,