[英]Question about polymorphism and overloading
我試圖理解多態和重載的概念。 我有以下代碼作為一種實驗。 但是,我無法弄清楚為什么這個程序沒有運行(因為mobj.foo(str)
而失敗。使用多態來定義mobj
,並且從我可以收集的內容中,應該是MyDerivedClass
類型。如果這是真的,這條線不會正常工作嗎?
為什么那條線無效?
class MyBaseClass {
protected int val;
public MyBaseClass() { val = 1; }
public void foo() { val += 2; }
public void foo(int i) { val += 3; }
public int getVal() { return val; }
}
class MyDerivedClass extends MyBaseClass {
public MyDerivedClass () { val = 4; }
public void foo() { val += 5; }
public void foo(String str) { val += 6; }
}
class Test {
public static void main(String[] args)
{
MyBaseClass mobj = new MyDerivedClass();
String str = new String("hello");
mobj.foo();
mobj.foo(str);
mobj.foo(4);
System.out.println("val = " + mobj.getVal());
}
}
它的失敗是因為
MyBaseClass mobj = new MyDerivedClass();
你告訴編譯器mobj是一個MyBaseClass,所以它不知道有一個foo(String)方法。
這種事情在運行時得到解決。
多態性僅在覆蓋父級已定義的方法時才有效,而mobj.foo(str)
。 MyBaseClass
沒有實現帶有簽名foo(String)
。 所以在MyDerivedClass
實現的foo(String)
並沒有覆蓋任何東西。 記住java通過名稱和參數區分方法。
mobj
是MyDerivedClass
一個實例,但是類型為MyBaseClass
。 所以,你可以打電話只為定義的方法MyBaseClass
上mobj
。 這就是為什么mobj.foo(str)
失敗了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.