#java #polymorphism
#java #полиморфизм
Вопрос:
если у меня есть следующий код, как показано ниже, поэтому Employee является подклассом Person , мой вопрос заключается в том, что когда мы вызываем p.getDescription() , он будет выполнять динамическую привязку, чтобы найти вызов метода getDescription(), на который указывает p, который является объектом Employee . И класс Person НЕ имеет метода с именем getDescription() . Единственный класс Employee реализует метод getDescription().
Но когда мы вызываем obj.getDescription(), почему мы получаем ошибку? Разве не все классы в java расширяют класс Object , так почему бы при вызове obj.getDescription() не выполнить динамическую привязку и не выяснить, что объект, на который он ссылается, на самом деле является объектом Employee, а затем соответствующим образом вызвать его метод?
Когда мы передаем объект в Employee, тогда все в порядке, что понятно
Спасибо, Эрик
Person p = new Employee("erik", 5000, 1989,04,16);
Object obj = new Employee("erik", 5000, 1989,04,16);
System.out.println(p.getDescription()); // get the description of the Employee
System.out.println(obj.getDescription()) // error
System.out.println(((Employee)obj).getDescription()); // OK
Спасибо всем за ответ, оказывается, в исходном коде, который, как я думал, Person не реализует getDescription() , но я ошибся (вот почему я задал этот вопрос), есть абстрактный метод Person of:
public abstract String getDescription()
Вот почему p.getDescription() работал, теперь все хорошо 🙂
Комментарии:
1. Вы получаете сообщение об ошибке, потому
ob
что j является переменной типаObject
иObject
не имеет вызываемого методаgetDescription()
2. Я имею в виду, что это может произойти с p.getDescription(), верно? Извините, мне нужно добавить, что у Person нет метода с именем getDescription()
3. То, что вы только что сказали, буквально невозможно. Если
p.getDescription()
приведенная выше строка компилируется правильно, то у класса Person (или интерфейса) действительно есть вызываемый методgetDescription()
. Вот как работают Java и ее компиляторы….4. Расширение B не означает, что B расширяет A. И A и B не могут одновременно расширять друг друга. (циклическая зависимость)
Ответ №1:
Не все классы в java расширяют класс объектов Да, каждый класс в Java по умолчанию расширяет класс объектов. Но ваш случай отличается, вы явно создаете Object obj=new Employee() . Фактически это создает объект класса Employee, в котором нет такой функции, как obj.getDescription()