Когда объект создается после вызова конструктора - PullRequest
0 голосов
/ 21 февраля 2012

Рассмотрим следующие классы кода.




     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!!
потому что когда вызывается конструктор класса A, он неявно вызывает конструктор суперкласса (java.lang.Object) перед вызовом метода callCreation () в конструкторе класса A.И это будет иметь место и для классов B и C.В том случае, когда вызывается конструктор B, поток вызовов обычно должен быть следующим: конструктор B -> конструктор A -> конструктор java.lang.Object -> возвращается к методу callCreation () A, чтобы завершить вызов конструктора A.Если да, то как печатается переопределенное значение, а не значение суперкласса?Итак, вопрос в том, когда объект класса создается точно?Другими словами, объект класса должен быть создан только после того, как конструктор завершит вызов / инициализацию всех элементов внутри себя.Если да, то как можно вызвать метод из дочернего класса, а не из родительского класса?

Ответы [ 2 ]

4 голосов
/ 21 февраля 2012

Методы callCreation в B и C переопределяют метод из A. Поэтому, когда метод вызывается в конструкторе A, реализации в B и C будут выполняться, даже если конструкторы из B и С еще не были выполнены. Это возможно, потому что конструкторы фактически не создают объект, а вызывают их инициализируют через несколько секунд после того, как JVM его создала.

В общем, очень плохая идея вызывать методы, которые по этой причине могут быть переопределены из конструктора. Метод в B или C может предполагать, что инициализатор конструктора и объекта уже был выполнен, и считывать неожиданное значение из поля. Например, следующее приводит к выводу "B Created!! null", поскольку поле все еще не присвоено его значение.

public class B extends A
{
    final String msg = "Yes!";

    protected void callCreation()
    {
        System.out.println("B Created!! "+msg);
    }
}
1 голос
/ 17 марта 2013

мышление таким образом делает это более очевидным: когда создается объект типа B, ключевое слово super () вызывает конструктор A, а затем в конструкторе A выполняется this.callCreation (), который ссылается на текущий объект.который является B, поэтому вызывается callCreation, соответствующий текущему объекту (B).тот же процесс выполняется для C.

открытый класс A {

public A() {
    this.callCreation();
}

protected void callCreation() {
    System.out.println("A Created!!");
}

}

класс B расширяет A {

public B() {
    super();
}

protected void callCreation() {
    System.out.println("B Created!!");
}

}

класс C расширяет B {

public C() {
    super();
}

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();

}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...