Java

Господа, я к вам с : "Наследование. конструкторы. "

Почему при компиляции вызывается конструктор класса А (суперкласс) ? вроде super() при вызове конструктора подкласса нету...

public static void main(String[] args) {
B obj = new B();

больше ничего в методе мейн нету.

-----
и еще очень важный вопрос,
что значит
A obj1 = new B();
(объект типа А = новый экземпляр B) ?

B obj2 = new A(); а так компилятор уже ругается.
Это последовательность инициализации классов при наследовании.
Если обобщать, то в целом происходит следующим образом.
Если существует какая-то цепочка наследования классов A...Z, где
A extends B, B extends C, ..Y extends Z
то инициализация при вызове new A(); будет происходить по следующим правилам:
1. Начиная с Z до А будут подряд инициализироваться статические поля и блоки в том порядке, в котором они записаны в классах. Сначала для Z полностью все статические поля и блоки, потом для Y и т. д. до A.
2. Опять начиная с Z до A будут инициализироваться нестатические поля и блоки в том порядке, в котором они записаны в классах + конструктор класса. Сначала для Z инициализируются все нестатические поля и блоки, после них конструктор класса Z. Затем для Y также и т. д. до А.

Если в указанной цепочке есть какое-то переопределение методов, то будет вызываться метод, который определен в том классе, который ближе к A. То есть если метод из класса Y переопределен и в D и в B, то будет вызываться именно метод из B.

Также есть особенности при вызове статических методов/полей из классов. Перед тем как совершить вызов статического метода/поля из какого-то класса, сначала будут инициализированы все статические поля и блоки. И уже после этого будет произведен вызов.
Ксенофонтов Юрий
Ксенофонтов Юрий
13 926
Лучший ответ
Ксенофонтов Юрий По поводу A obj1 = new B();
Это означает, что в obj1 будут доступны публичные методы класса A (или интерфейса, с ними такое же можно провернуть), если какие-то из них переопределены в B, то будут вызываться переопределенные методы из B. Это бывает удобно, когда существует несколько реализаций класса A. Достаточно подменить правую часть на другую реализацию и поведение будет изменено.
Артём Клепинин спасибо за ответ, буду разбираться! :)
ругается потому что ты не можешь создать отца по подобию дитя...