Не удается разрешить метод ‘childMethod’ в ‘Sup3r’

#java #inheritance

#java #наследование

Вопрос:

Рассмотрим следующие два класса:

 public class Sup3r {
    public void sup3rMethod() {}
}

public class Child extends Sup3r {
    public void childMethod() {}
}
 

и следующие три утверждения:

 s.sup3rMethod();
c.childMethod();
s.childMethod();
 

Последнее утверждение дает

Не удается разрешить метод ‘childMethod’ в ‘Sup3r’

Почему?

Комментарии:

1. Вероятно, потому s , что это a Sup3r , а не a Child . Поскольку мы не можем видеть, где вы определили s , или c мы можем только строить предположения.

2. Пожалуйста, покажите полный пример кода, включая создание s и c .

3. Потому что … полиморфизм. При s.childMethod( ) вызове компилятор знает только, что s это a Sup3r . Sup3r Не определяет childMethod . Рассмотрите возможность того, что существует какой-то другой дочерний класс Sup3r . Он не будет определять (это) childMethod . Компилятору не разрешается предполагать, что Child это единственный существующий подкласс.

Ответ №1:

потому что метод childMethod существует только в подклассе Child . Sup3r не наследует этот метод, Child поэтому childMethod его нельзя вызвать с помощью s .

Если ссылочная переменная s содержит Child экземпляр, вы можете заставить ее работать casting s Child сначала с типом, а затем вызвать метод на s.

 ((Child)s).childMethod();
 

Если ссылочная переменная s на самом деле не содержит Child экземпляра, то вместо этого вы получите a ClassCastException .

Редактировать:

Есть еще один способ заставить его работать, и это путем создания суперкласса Sup3r abstract и добавления абстрактного метода childMethod() в класс следующим образом:

 public abstract class Sup3r {
    public void sup3rMethod() {}
    public abstract void childMethod();
}

public class Child extends Sup3r {
    public void childMethod() {} //implementation code here, the empty block would suffice too however.
}
 

abstract означает, что вы оставляете реализацию метода childMethod() одному из Sup3r s реализующих подклассов. Если вы внесете это изменение в свой код, вы сможете вызывать childMethod() on s без необходимости Child сначала приводить к нему. Но результат childMethod() будет зависеть от конкретной childMethod() реализации метода экземпляра подкласса, на который s ссылается.

Комментарии:

1. «Аннотация» — это то, что решит мою проблему. У меня был полный ментальный блок по этому поводу! 🙁 Спасибо за вашу помощь.