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
  }
}

Как вы можете переопределить метод, который является окончательным.

Окончательные методы никогда не могут быть переопределены в подклассе.

Это ошибка компиляции..

Другие вопросы по тегам