![](/img/trans.png)
[英]Is there a better solution to using KeyAdapter/KeyListener for what I intend on using it for?
[英]Not able to implement what I intend using toString and inheritance
筆記:
從答案中我可以看出 toString 和繼承不足以實現我的意圖。 請建議一個可以解決我的用例的替代實現。
public class A {
String c;
String d;
A(String c, String d) {
this.c = c;
this.d = d;
}
@Override
public String toString() {
return c + d;
}
}
public class B extends A {
String a;
String b;
B(String a, String b, String c, String d) {
super(c,d);
this.a = a;
this.b = b;
}
@Override
public String toString() {
return super.toString() + a + b;
}
public static void main(String[] args) {
B b = new B("a","b","c","d");
A a = (A)b;
System.out.println(a);
}
}
系統輸出正在打印 cdab。
我想要的是在對象 b 被強制轉換為 a 之后,它應該調用 A 類的 toString。 所以我希望輸出是 cd。
另外,我希望 b.toString() 返回 cdab。 但是 ((A)b).toString() 返回 cd。
我想要的是在對象 b 被強制轉換為 a 之后,它應該調用 A 類的 toString。
這是不可能的。
對象的實際類型決定了調用的方法。 鑄造不會改變這一點,其他任何事情也不會。
如果您希望能夠在B
實例上調用A.toString()
,則不得覆蓋它。
將對象轉換為其超類的類型無效。 您可以將b
分配給a
而不進行強制轉換。
B
的toString
無論如何都會被調用,因為被調用的方法取決於調用它的對象的運行時類型,在你的情況下是B
。 這就是方法覆蓋的工作方式。
通過保持簡單,您可以說無論轉換后的b
是什么,在內部它都是new B("a","b","c","d");
它將調用B
toString
。 現在,即使在將它轉換為A
它也會調用B
toString
,因為每個Mango
基本上都是Fruit
但它將永遠保持Mango
。
有趣的問題!
嘗試
@Override
public String toString() {
return super.toString();
}
反而
@Override
public String toString() {
return super.toString() + a + b;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.