java, нестатический к статическому методу - скрытие или переопределение
Переопределение нестатического метода в подклассе с тем же всем, но как статическое переопределение или скрытие его?
http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html говорит, что скрывается. но когда я объявляю метод суперкласса как final, я получаю ошибку переопределения.
объявление суперкласса
final static void display() { ... }
подкласс:
void display() { ... }
дает ошибку переопределения.
5 ответов
Переопределение нестатического метода в подклассе с тем же всем, но как статическое переопределение или скрытие?
Это не так, потому что это вызывает ошибку компиляции, делая вашу программу недействительной.
class A {
void x();
}
class B extends A {
// ERROR!!!
static void x();
}
Скрытие происходит, когда оба метода в паре являются статическими; переопределение происходит, когда оба метода в паре являются методами экземпляра. Когда один из двух является статическим методом, а другой - методом экземпляра, Java считает это ошибкой. Не имеет значения, является ли метод экземпляра окончательным или нет; также не имеет значения, находится ли статический метод в базовом или в производном классе: Java в любом случае называет его ошибкой.
Сообщение компилятора, которое говорит, что "не может переопределить", вводит в заблуждение: я думаю, что "конфликт имен" был бы лучшим именем для таких условий, потому что "переопределение" зарезервировано для ситуаций с двумя методами экземпляра.
Метод, который вы описываете, является методом экземпляра, а не статическим методом. Вы не можете скрыть методы экземпляра, только статические методы. Метод экземпляра объявлен final
не может быть переопределено в подклассе, и это то, что вы пытаетесь сделать.
final static void display() { ... }
Вышеуказанный метод имеет модификатор отсутствия доступа final
и метод, который был сделан final
не может быть отменено
Вы не можете переопределить последний метод...
Пример:
class Super
{
final void display()
{
//do something
}
void show()
{
//Do Something
}
}
class Sub extends Super
{
//Not Valid hence Compile Error
void display()
{
//do something
}
//Valid
void show()
{
//Do Something
}
}
Как вы можете переопределить метод, который является окончательным.
Окончательные методы никогда не могут быть переопределены в подклассе.
Это ошибка компиляции..