У меня есть три класса: тестовый класс, класс формы и класс геометрического объекта. Класс формы расширяет класс геометрического объекта (класс геометрического объекта является абстрактным). Дело в том, что класс формы и геометрический объект имеют один и тот же метод toString, но их содержимое разное. Когда я вызываю метод toString в тестовом классе, я получаю результаты из метода toString в классе формы. Когда я пытаюсь привести объект, который я создал, в класс GeometryObject и пытаюсь вызвать там метод toString, я все равно получаю тот же результат от метода toString класса shape. Так перезаписывает ли суперкласс методы в абстрактных/подклассах, если они имеют одно и то же имя/список аргументов?
Путают с наследованием с абстрактным классом. Методы перезаписывают друг друга?
Ответы (2)
Поведение, которое вы видите здесь, связано с полиморфизмом и перегрузкой функций. Если у вас есть метод toString() в базовом классе и производном классе, он всегда будет вызывать самую производную версию метода toString(), которая находится в производном классе. Неважно, как вы храните ссылку на производный класс (например, в ссылке на производный класс, в ссылке на базовый класс или в ссылке на объект).
Это верно независимо от того, реализует ли базовый класс метод toString() или только что объявил его. Это верно и для всех других методов — toString() не является чем-то особенным, за исключением того факта, что он является частью базового контракта Object.
Таким образом, вы увидите здесь такое же поведение, даже если вы приведете свой производный класс к Object и вызовете для него toString().
PS: Вы должны аннотировать свои переопределенные методы, такие как toString(), используя @Override в Java, чтобы сделать их более явно узнаваемыми — многие инструменты / IDE работают над этой концепцией.
если ваш класс 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 Luiggi Mendoza; 02.04.2014