无法实现我打算使用toString和inheritance

时间:2016-04-20 09:21:29

标签: java inheritance tostring

注意:

从答案我可以收集到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。

4 个答案:

答案 0 :(得分:3)

  

我想要的是在对象b被强制转换为a之后,它应该调用A类的toString。

这是不可能的。

对象的实际类型决定了被调用的方法。施法不会改变这一点,也不会改变其他任何内容。

如果您希望能够在A.toString()个实例上拨打B,则不得覆盖它。

答案 1 :(得分:1)

将对象转换为其超类的类型无效。您可以在不进行投射的情况下将b分配给a

无论如何都会调用<{B&#39; 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;
}