簡體   English   中英

在繼承中轉換對象,為什么要輸出?

[英]Casting an object in inheritance, why this output?

有T級:

public class T
{
    protected String name;
    public T(String name)
    {
        this.name = name;
    }
    public String toString()
    {
        return "T:"+this.name;
    }
}

G類:

public class G extends T
{
     public G(String name)
     {
          super(name);
     }
     public String toString()
     {
          return "G:" + super.toString();
     }
}

我跑的時候

G a3 = new G("me");
System.out.println((T)a3)

它打印G:T:me

我不明白為什么。 我以為它會打印T:me 我聲稱這是因為它被轉換為對象T.因此,使用類T的toString()但是,我錯了。 為什么會這樣?

我知道類沒有好名字,這是一個關於理解多態和繼承的問題,而不僅僅是編寫我需要的特定代碼。

類G中的toString()方法會覆蓋類T中的方法,因此它會被選中。 編譯器使用對象的靜態類型來決定要使用的方法的重載 如果有兩個不同的 toString()方法在T上定義可供選擇,和/或G定義另一個toString()以某種方式重載,它只會有所不同 - 盡管當方法沒有參數時它不可能實現。

這里的關鍵點是演員表不會以任何方式改變對象 它所做的只是允許您將其視為不同(兼容)類型。 對象功能保持完全相同

編碼:

 public String toString()
 {
      return "G:" + super.toString();
 }

完全刪除舊的toString ,使其完全不再可訪問(大多數情況下)。

G a3 =新G(“我”);

這一行既調用T的構造函數,也調用G.

public T(String name)
{
    this.name = name;
    // so, this.name gets initialised to me.
}

public G(String name)
 {
      super(name);
 }

現在,由於您已重寫了toString()方法, 但是 ,調用System.out.println((T)a3)不會將a3的類型從Object更改為任何其他類型。 它使得打印a3成為一個對象成為可能(因為println()也接受Object類型的參數),但是,a3仍然在兩個類中被重寫。

因此,將調用您的toString()方法,從而導致打印G:T:me.

暫無
暫無

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

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