Динамическая привязка класса объектов Java

#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()