Кто-нибудь может объяснить, как работают конструкторы, наследование и полиморфизм времени выполнения? Также объясните логику за выводом ниже - PullRequest
0 голосов
/ 27 марта 2019

Я предполагаю, что причина моего вывода - полиморфизм времени выполнения. Но я не могу понять, как? Объясните, пожалуйста, как связаны полиморфизм, конструкторы и наследование во время выполнения.

Это код JAVA. У меня плохое понимание полиморфизма во время выполнения, но я не смог понять его.

пакет df;

класс А1 {

A1(){
    System.out.println("Constructor A() called"); 
}
void m1() { 
    System.out.println("Inside A's m1 method"); 
} 

}

класс B2 расширяет A1 {

B2(){
    System.out.println("Constructor B() called"); 
}

void m1() { 
    System.out.println("Inside B's m1 method"); 
} 

}

класс C3 расширяет A1 {

C3(){
    System.out.println("Constructor C()"); 
}
void m1() { 
    System.out.println("Inside C's m1 method"); 
} 

}

публичный класс Cldf {

// object of type A 
public static void main(String[] args) {
    A1 a = new B2(); 

}

}

Я ожидал результата, как показано ниже

Вызван конструктор B ().

но результат

Конструктор A () вызван Конструктор B () называется

Ответы [ 2 ]

0 голосов
/ 27 марта 2019

Конструктор класса вызывается, когда объект этого класса инициализируется.В вашем примере класс B2 расширяет класс A1.Когда создается объект B2, вызывается конструктор B2 ().В идеале вы должны вызывать супер-конструктор в вашем конструкторе B2, например

    B2(){
        super();
        System.out.println("Constructor B() called"); 
    }

Так что, когда вы вызываете B2 () во время создания объекта, он вызывает конструктор суперкласса.Если это не реализовано по умолчанию, Java-компилятор вызовет конструктор суперкласса.Таким образом, ваш результат вызвал конструктор A (), а затем вызвал конструктор B ().В приведенном ниже примере ссылка на родительский класс, а объект дочернего класса.A1 a = новый B2 ();Поскольку объектом является B2, вызывается конструктор B2 (), который по умолчанию вызывает A1 ().Теперь, если вы вызовете a.m1 (), он напечатает «Внутри метода А m1».Это связано с тем, что ссылка имеет родительский тип, а родительская ссылка может обращаться только к методам родительского класса.Если ваш родительский класс не имеет m1, а ваш класс имеет m1, вы получите ошибку времени компиляции.

0 голосов
/ 27 марта 2019

super () по умолчанию вызывается из подкласса при наследовании. Это делается компилятором.

Это сделано потому, что если суперкласс инициализирует какую-либо закрытую переменную внутри своего конструктора, он должен быть инициализирован. Сказав это, это не означает, что 2 объекта созданы. Создан только один экземпляр подкласса.

В вашем случае конструктор B2 по умолчанию вызывал конструктор A1.

Попробуйте выполнить ниже, и вы столкнетесь с ошибкой компиляции.

Class A1{
    public A1(String msg){
    }
}

Class B2 extends A1{
    public B2(){
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...