簡體   English   中英

關於多態和重載的問題

[英]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通過名稱和參數區分方法。

mobjMyDerivedClass一個實例,但是類型為MyBaseClass 所以,你可以打電話只為定義的方法MyBaseClassmobj 這就是為什么mobj.foo(str)失敗了。

暫無
暫無

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

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