注意:
从答案我可以收集到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。所以我想要输出 光盘。
另外, 我希望b.toString()返回cdab。但是((A)b)。toString()返回cd。
答案 0 :(得分:3)
我想要的是在对象b被强制转换为a之后,它应该调用A类的toString。
这是不可能的。
对象的实际类型决定了被调用的方法。施法不会改变这一点,也不会改变其他任何内容。
如果您希望能够在A.toString()
个实例上拨打B
,则不得覆盖它。
答案 1 :(得分:1)
将对象转换为其超类的类型无效。您可以在不进行投射的情况下将b
分配给a
。
B
' toString
,因为被调用的方法取决于调用它的对象的运行时类型,即B
in你的情况。这就是方法重写的方式。
答案 2 :(得分:1)
通过保持简单,您可以说无论在投射后b
是什么new B("a","b","c","d");
,内部都是toString
,它会调用B
的{{1}}。现在,即使将其转换为A
,也会调用toString
B
,因为每个Mango
基本上都是Fruit
,但它将永远保持Mango
。
答案 3 :(得分:-1)
有趣的问题!
试
@Override
public String toString() {
return super.toString();
}
代替
@Override
public String toString() {
return super.toString() + a + b;
}