2013-12-22 135 views
0

爲什麼在這裏沒有發生重載,即使將整數參數傳遞給方法「p」。 ?通過覆蓋重載

public class Test { 
    public static void main(String[] args) { 
     B a = new A(); 
     a.p(10); 
     a.p(10.0); 
    } 
} 

class B { 
    public void p(double i) { 
     System.out.println(i * 2); 
    } 
} 

class A extends B { 
    // This method the method in B 
    public void p(int i) { 
     System.out.println(i); 
    } 
    //added below code 
    public void p(double i) { 
     System.out.println(i*5); 
    } 
} 



Output:50.0 
     50.0 
+2

使'A'延伸'B'令人難以置信的混淆。幾乎每個世界上壓倒一切的例子都讓'A'成爲父類。 –

回答

2

因爲變量a被聲明爲B,僅在B聲明的p方法是可見的,因此選擇。沒有壓倒一切。

如有疑問,請在您最喜歡的IDE中用@Override註釋您的方法。如果它沒有實際覆蓋任何東西,IDE將不會讓它編譯。


編輯完成後,您現在擁有A#p(double)形式的重寫方法。當你調用

a.p(10); 
a.p(10.0); 

的方法p上可見B類將被調用。通過多態性,並且由於變量a的運行時類型爲A,因此將調用在A中聲明的重寫方法。


注意,int論點

a.p(10); 

成爲double通過widening primitive conversion

0

因爲您通過引用來調用東西B。那只有一種方法。

+0

那麼這裏對象A的用法是什麼?當對象(這裏是「A」)特定的方法執行時? – user3126466

+0

@ user3126466:在這種情況下,沒有用處。您的示例中沒有重寫的方法。 –

+0

現在我編輯並在類A中添加了overriden方法。因此,重載在此處不存在。 – user3126466

0

它總是調用B的方法,這是因爲:

  • 變量是B型的,所以編譯器只知道在double方法
  • A方法不會覆蓋B的方法因爲參數類型int不同於Bdouble - 它對呼叫代碼是不可見的