Правильно ли я понял, что: при переопределении метода Z( ) наследуемого класса, если реализация этого метода в классе-наследнике не отличается от родительской (притом что родительский класс не абстрактный и не интерфейс), то во время вызова метода Z( ) в классе-родителе (не через this.) фактически будет вызван "переопределенный" метод Z( ) класса-наследника.
Или правильно - ТОЛЬКО: "Главное, не в каком классе написан метод, а какой тип (класс) объекта, у которого этот метод вызван."
Т.е. при новом объекте new B(6); вызывается родительский класс super(f1);, методы которого ПО-УМОЛЧАНИЮ будут иметь реализацию класса-наследника.
Что из этого правильно ?
Андрей
20 уровень
Задача решена. Утвердите правильность понимания пожалуйста!
Решен
Комментарии (8)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Андрей
27 марта 2020, 13:08
public class Solution {
public static void main(String[] args) {
new B(6);
}
public static class A {
private int f1 = 7;
public A(int f1) {
this.f1 = f1;
initialize();
}
protected void initialize() {
System.out.println(f1);
}
}
public static class B extends A {
protected int f1 = 3;
public B(int one) {
super(one);
this.f1 += one;
initialize();
}
protected void initialize() {
System.out.println(f1);
}
}
}
0
Ksenia Volkova Java Developer в DXC Master
27 марта 2020, 15:10полезный
Насколько я помню задачу, там дело в том, что если переменная f1 в А - private, то для B оне не видна и недоступна
+1
hidden #598481
27 марта 2020, 12:47
Реализация ни при чем, тип объекта определяет, метод какого класса будет выполняться.
Если объект класса родителя, то выполняется метод класса родителя, если объект - наследник, то выполнится метод класса наследника.
При этом, когда выполняется конструктор наследника, то сначала неявно вызывается конструктор родителя, и после его выполнения уже выполняется тело констуктора наследника:
0
Андрей
27 марта 2020, 14:42
СпасибоТебе! Если может позже будет позволять время, посмотри пожалуйста на эту задачу "Дебаг, дебаг, и еще раз дебаг". Правильно ли что причиной того что изначально в условии задачи отрабатывает два раза метод initialize() класса B, является: "тип объекта класса В определяет, то что именно его метод будет выполняться"?
0
hidden #598481
27 марта 2020, 15:00решение
Если речь про код из коммента выше, то причина в том, что констуктор наследника сначала вызывает конструктор родителя. А каждый из них уже вызывает initialize().
А, понял вопрос, пока писал.
Ну да, каждый из конструкторов вызовет метод наследника, поскольку создается объект дочернего класса.
+2
Ksenia Volkova Java Developer в DXC Master
27 марта 2020, 12:41
Лучше с кодом...
0
Андрей
27 марта 2020, 13:10
добавил
0
Андрей
27 марта 2020, 12:25
Т.е., является ли написанное выше причиной по которой задача выводила неверные данные?
0