2017-04-06 155 views
0
class Bank{ 
    float getRateOfInterest(){return 0;} 
} 

class SBI extends Bank{ 
    float getRateOfInterest(){return 8.4f;} 
} 

class TestPolymorphism{ 
    public static void main(String args[]){ 
     Bank a = new SBI(); 
     SBI b = new SBI(); 
     a.getRateOfInterest(); 
     b.getRateOfInterest(); 
    } 
} 

a.getRateOfInterest()b.getRateOfInterest()都給出相同的輸出。那麼這兩個陳述之間有什麼區別?混淆創建類實例

我覺得第一個是臨近預測。

+0

可能的重複[如何在Java中動態方法調度工作](http://stackoverflow.com/questions/43062344/how-does-dynamic-method-dispatching-work-in-java) –

回答

1

Java方法都是虛擬的,所以調用的方法取決於被調用對象的運行時類型,而不是保存引用的變量的編譯時類型。

+0

哦,你擊敗了我。 – javaLover

0

所有java方法都是虛擬的(通過設計)。
他們依靠實現類來提供方法實現。

以下是更多信息。
- Can you write virtual functions/methods in Java?
- https://en.wikipedia.org/wiki/Virtual_function

這裏是維基百科摘錄: -

public class Animal { 
    public void eat() { 
     System.out.println("I eat like a generic Animal."); 
    } 

    public static void main(String[] args) { 
     Animal animal=new Wolf(); 
     animal.eat(); //print "I eat like a wolf! 
    } 
} 
class Wolf extends Animal { 
    @Override 
    public void eat() { 
     System.out.println("I eat like a wolf!"); 
    } 
} 

虛函數都解決了 '晚'。如果所討論的函數在基類中爲'虛擬' ,則根據所引用的對象 的實際類型調用該函數的派生最多的類的實現 ,而不管指針或 引用的聲明類型。如果它不是'虛擬的',則該方法在'提前'解決,並且根據指示或引用的聲明類型選擇所調用的函數。

虛擬功能允許程序調用編譯代碼時必須存在的方法。

0

這不是,如果你用new SBI()構造它。它總是會返回8.4f