Java Puzzler - Кто-нибудь может объяснить это поведение? - PullRequest
2 голосов
/ 03 октября 2009
abstract class AbstractBase {
    abstract void print();

    AbstractBase() {
        // Note that this call will get mapped to the most derived class's method
        print();
    }
}

class DerivedClass extends AbstractBase {
    int value = 1;

    @Override
    void print() {
        System.out.println("Value in DerivedClass: " + value);
    }   
}

class Derived1 extends DerivedClass {
    int value = 10;

    @Override
    void print() {
        System.out.println("Value in Derived1: " + value);
    }
}

public class ConstructorCallingAbstract {

    public static void main(String[] args) {
        Derived1 derived1 = new Derived1();
        derived1.print();
    }
}

Приведенная выше программа производит следующий вывод:

Value in Derived1: 0
Value in Derived1: 10

Я не понимаю, почему конструктор print() in AbstractBase всегда отображается в класс самого производного (здесь Derived1) print()

Почему бы не DerivedClass print()? Может ли кто-нибудь помочь мне понять это?

Ответы [ 2 ]

9 голосов
/ 03 октября 2009

Поскольку все вызовы методов Java, которые не являются явно super вызовами, отправляются самому производному классу, даже в конструкторах суперкласса. Это означает, что суперклассы получают преимущества от поведения подкласса, но это также означает, что теоретически переопределенные методы могут быть вызваны до конструктора в этом классе.

2 голосов
/ 03 октября 2009

Виртуализация в конструкторе Super Class.

Взгляните на Виртуализация в конструкторе Super Class

...