[英]Casting an object in inheritance, why this output?
public class T
{
protected String name;
public T(String name)
{
this.name = name;
}
public String toString()
{
return "T:"+this.name;
}
}
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.