Есть классы А и В. В наследуется от А. В классе А есть метод doSomething(), а в В он переопределен. Далее есть код.
А a = new B();
a.doSomething();
Какой метод вызовется? Скорее всего переопределеный(но поправьте если не так), но есть более важный вопрос. На каком то из лекций было сказано что:
SomeClass cl = new SomeClass();
cl.someMethod(); // то же самое что и SomeClass.someMethod(cl);
Что происходит в примере вопроса?
B.doSomething(a); ?
Если да, как java понимает что именно В? Ведь переменная типа А. Как там все устроено? Что из себя представляет объект класса в памяти?
lost
22 уровень
Вопрос про наследование
Решен
Комментарии (5)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Wladyslaw Java Developer Master
26 сентября 2019, 04:50полезный
Разрешение переопределенных методов происходит в рантайме. Читать - позднее связывание.
Да хоть вот тут
+2
АлександрExpert
25 сентября 2019, 19:29
1. Вызовется метод того класса, которому принадлежит объект. То есть, переопределенный.
2. cl - это же по сути ссылка на объект. Так вот в метод в неявном виде передается ссылка на объект, чтобы метод мог работать именно с ним. Кстати, в питоне, ЕМНИП, в явном виде во все методы первым параметром передается объект.
0
lost
25 сентября 2019, 20:19
С этим все понял. А вот объект в памяти хранит в себе ссылку на свой класс? Иначе я не знаю как java понимает какой метод нужно вызывать.
И если допустим сделаем следующее:
String s =new String("qwerty");
s = (Integer)s;
Что имеено изменится в памяти? Сама ссылка s или какие то метаданные(если они есть) в памяти где хранится обьект?
0
АлександрExpert
25 сентября 2019, 20:44решение
объект конечно же должен знать, экземпляром какого класса он является.
s = (Integer)s; даже не скомпилируется.
нельзя присвоить переменной типа s объект класса Integer
и нельзя привести объект класса String к типу Integer, только к родительскому/дочернему объекту.
и то, если объект является в реальности экземпляром родительского класса, то попытка привести к дочернему приведет к ошибке на этапе выполнения
+2
lost
25 сентября 2019, 21:28
Теперь все ясно) Спасибо!
0