Полиморфизм и наследование в Java со статическими методами абстрактного класса - PullRequest
0 голосов
/ 10 сентября 2018

Я проходил тестовые вопросы по экзамену Java 8 Programmer I на веб-сайте Oracle и наткнулся на следующий вопрос:

abstract class Writer {
  public static  void write() {
    System.out.println("Writing...");
  }
 }
class Author extends Writer {
public static void write() {
       System.out.println("Writing book");
    }
 }
class Programmer extends Writer {
   public static void write() {
     System.out.println("Writing code");
   }
public static void main(String[] args) {
  Writer w = new Author();
   w.write();//What would be the ouput here?
    }
 }

Правильный ответ: метод абстрактного класса вызывается.

Теперь я понял, что в полиморфизме, если переменная родительского класса типа содержит ссылку на объект подкласса, будет вызван метод подкласса.

Следовательно, правильно ли я понимаю, что в случае статической функции будет вызван метод класса, переменная которого содержит ссылку?

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Для статических методов полиморфизм отсутствует.

Компилятор решает во время компиляции, какой метод будет вызван.

Он видит, что w является Writer, и не знает и не заботится о том, будет ли фактический экземпляр этого конкретного подкласса во время выполнения. Компилятор может знать это иногда, но Java выбирает легкий путь.

Это одна из причин, почему вы действительно осторожны в использовании статических методов в реальном производственном коде: делать это означает пожертвовать одним из основных элементов ООП.

0 голосов
/ 10 сентября 2018

Нет, вы не можете переопределить статические методы в подклассе, поэтому нет полиморфного поиска метода во время выполнения. Статические методы не взаимодействуют с полями / методами экземпляра класса, поэтому вызов статического метода в зависимости от конкретного экземпляра / подкласса не имеет смысла.

Статические методы проще воспринимать как методы утилит / библиотек. И они содержатся в классах только для целей организации.

...