Путают с наследованием с абстрактным классом. Методы перезаписывают друг друга?

У меня есть три класса: тестовый класс, класс формы и класс геометрического объекта. Класс формы расширяет класс геометрического объекта (класс геометрического объекта является абстрактным). Дело в том, что класс формы и геометрический объект имеют один и тот же метод toString, но их содержимое разное. Когда я вызываю метод toString в тестовом классе, я получаю результаты из метода toString в классе формы. Когда я пытаюсь привести объект, который я создал, в класс GeometryObject и пытаюсь вызвать там метод toString, я все равно получаю тот же результат от метода toString класса shape. Так перезаписывает ли суперкласс методы в абстрактных/подклассах, если они имеют одно и то же имя/список аргументов?


person The unknown    schedule 02.04.2014    source источник


Ответы (2)


Поведение, которое вы видите здесь, связано с полиморфизмом и перегрузкой функций. Если у вас есть метод toString() в базовом классе и производном классе, он всегда будет вызывать самую производную версию метода toString(), которая находится в производном классе. Неважно, как вы храните ссылку на производный класс (например, в ссылке на производный класс, в ссылке на базовый класс или в ссылке на объект).

Это верно независимо от того, реализует ли базовый класс метод toString() или только что объявил его. Это верно и для всех других методов — toString() не является чем-то особенным, за исключением того факта, что он является частью базового контракта Object.

Таким образом, вы увидите здесь такое же поведение, даже если вы приведете свой производный класс к Object и вызовете для него toString().


PS: Вы должны аннотировать свои переопределенные методы, такие как toString(), используя @Override в Java, чтобы сделать их более явно узнаваемыми — многие инструменты / IDE работают над этой концепцией.

person John Humphreys    schedule 02.04.2014
comment
Теперь я понимаю. Спасибо! - person The unknown; 02.04.2014
comment
Не за что, рад помочь :) - person John Humphreys; 02.04.2014

если ваш класс geometricObject является абстрактным, то все, что он может иметь для метода toString(), это:

public String toString();.

Нет тела метода.

В любом случае toString() наследуется от родителя всех классов, Object.

Если ваш class Shape extends geometricObject и определяет свой toString(), какой он должен, то да, вы получите именно то, что указано в toString() класса Shape.

Дополнительные сведения о переопределении методов см. на странице http://docs.oracle.com/javase/tutorial/java/IandI/override.html

person geoff    schedule 02.04.2014
comment
У вас может быть конкретный метод в абстрактном классе. - person rgettman; 02.04.2014
comment
Если метод не является абстрактным, вы должны убедиться, что он имеет хотя бы пустое тело {}, иначе он не скомпилируется. Возможно, вы путаете абстрактный класс с интерфейсом. - person Luiggi Mendoza; 02.04.2014
comment
Абстрактные классы похожи на интерфейсы. Вы не можете создавать их экземпляры, и они могут содержать сочетание методов, объявленных с реализацией или без нее. @ docs.oracle.com/javase/tutorial/java/IandI/abstract.html - person John Humphreys; 02.04.2014