Рассмотрим следующие классы кода.Когда объект создается после того, как конструктор называется
public class A
{
public A()
{
callCreation();
}
protected void callCreation()
{
System.out.println("A Created!!");
}
}
public class B extends A
{
protected void callCreation()
{
System.out.println("B Created!!");
}
}
public class C extends B
{
protected void callCreation()
{
System.out.println("C Created!!");
}
public static void main(String[] args)
{
A a = new A();
A b = new B();
A c = new C();
}
}
Результат работы класса C приведен ниже.
A Created!! B Created!! C Created!!
Первый линейный выход на выходе
A Created!!печатается, потому что, когда конструктор класса А называется, он вызывает конструктор суперкласса (в java.lang.Object) неявно перед вызовом метода callCreation() в класс А. И это будет иметь место и для классов B и C. В этом случае, когда конструктор B называется потоком вызова, должен быть типичным: конструктор B -> A Constructor -> java.lang.Object's Constructor -> возвращается к методу callCreation() для завершения вызова конструктора A. Если да, то как печатается переопределенное значение, а не значение суперкласса? Таким образом, возникает вопрос: «Когда объект точно создан? иначе говоря, объект класса должен быть создан только после того, как конструктор завершит вызов/инициализацию всех элементов внутри себя. Если да, как можно вызывать метод из дочернего класса, а не из родительского класса?
+1 Точно - он всегда вызывается из одного и того же конструктора. Единственное различие заключается в том, где идет звонок. –
Неужели jvm нужен объект для вызова метода на нем? Пожалуйста, найдите мой комментарий в ответе ниже. – user1223879
Да; на самом деле ему также нужен объект, для которого нужно * запустить конструктор *. Объект существует задолго до того, как конструктор будет выполнен. – Joni