Некоторых родственные пункты:
1) Компилятор автоматически вставляет вызов на нет аргумента супер конструктор класса в любом конструкторе, который не содержит явный вызов конструктора суперкласса. (Я рекомендую вам выбирать явное поведение по неявному поведению при написании кода, но это спорная точка стиля). Во всяком случае компилятора ваш код будет выглядеть следующим образом:
class A{
public A() {
System.out.println(this.getClass().getName());
}
}
class B extends A{
public B() {
super();
System.out.println(this.getClass().getName());
}
}
class C extends B{
public C() {
super();
System.out.println(this.getClass().getName());
}
}
class Main{
public static void main(String[] args){
new C();
}
}
Это дает понять, что System.out.println называют три отдельные раза.
2) Использование этого внутри конструктора для вызова методов может в целом привести к довольно странному поведению. См. Например: this. Это связано с тем, что инициализация работает следующим образом:
1) Вызывается конструктор класса C. В этот момент память выделяется для объекта класса C, а метаданные объектов, включая его класс, реализованные интерфейсы заполняются внутри виртуальной машины. Все поля, , включая унаследованные поля, инициализируются до их значением по умолчанию.
2) Вызывается конструктор класса B. Внутри конструктора это относится к объекту класса C, но ни одно из полей, инициализированных в конструкторе C, еще не было инициализировано. Это немедленно вызовет конструктор класса A.
3) Выполняется конструктор класса A. Поля, заданные в этом конструкторе, инициализируются. Конструктор выполняет методы и инициализации и возвращает, и стек возвращается к конструктору B.
4) Конструктор B выполняет свои методы и возвращает управление конструктору C.
5) Конструктор C возвращается.
Итак, теперь мы понимаем, что происходит: эта цепочка печатает C три раза. Я подозреваю, что вы хотите написать:
class A{
public A() {
System.out.println(A.class.getName());
}
}
class B extends A{
public B() {
super();
System.out.println(B.class.getName());
}
}
class C extends B{
public C() {
super();
System.out.println(C.class.getName());
}
}
class Main{
public static void main(String[] args){
new C();
}
}
который распечатает A, B, C.
Этот код ничего не возвращает.У него нет функции 'main', поэтому нет способа сказать, что именно вы используете. –
Итак, вы создали объект типа 'C' и ожидали трех разных распечаток? Это не то, как работает наследование объектов. – Keppil
Вы получите сообщение 'c', потому что вы переопределяете конструктор и объявляете экземпляр' c', – Ahmad