簡體   English   中英

Java Puzzler - 任何人都可以解釋這種行為嗎?

[英]Java Puzzler - Can anyone explain this behavior?

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

我不明白為什么AbstractBase構造函數中的print()總是被映射到派生類最多的類(這里是Derived1print()

為什么不到DerivedClassprint() 有人能幫助我理解這個嗎?

因為所有非顯式super調用的Java方法調用都被調度到最派生類,即使在超類構造函數中也是如此。 這意味着超類可以獲得子類行為的好處,但這也意味着理論上可以在該類中的構造函數之前調用重寫方法。

超類構造函數中的虛擬化。

看一下Super Class Constructor中的虛擬化

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM