[英]why polymorphism in java call the methods from the superclass
///Example code here
Superclass{
method1(){
print(do1);
}
method2(){}
}
Subclass extends Superclass{
///override method1
method1(){
print(do2);
}
method3(){}
}
我對Java中的多態性有一個疑問,那就是何時Superclass s =new Subclass()
。 “ s”對象總是調用超類中的方法,但是當覆蓋方法發生時,“ s”將指向覆蓋方法。
更新:因此,問題是誰可以為引用“ s”創建堆地址,如果它可以最終編譯並運行。 如果超類創建了它,為什么要使用新的Subclass()而不是新的Superclass()。 如果子類創建了它,為什么不能使用s.method3()。
可以調用method3。 您只需要先投射它即可。 如果他們允許s調用method3作為超類,那是沒有意義的,因為並非所有超類都可以調用method3。
方法的動態綁定將在運行時確定,因此,當您使用s作為超類編譯器的引用調用方法時,將始終首先檢查超類是否具有該方法。 有2種情況
1.如果超類具有方法,則JVM將繼續檢查子類;如果子類具有重寫方法,則將調用該方法;如果子類沒有該方法,則通常將調用父類方法。
2.如果超類沒有該方法,則編譯將失敗,因為編譯器無法在引用變量的類中標識任何方法
因此,在您的情況下,如果超類沒有method3,那么它將反抗地給出編譯錯誤
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.