使用obj1 = obj2进行直接Java转换;

时间:2016-08-06 21:32:48

标签: java inheritance casting reference

有三个班级

class Flower{}
class Violet extends Flower{}
class Gardenia extends Flower{}

主要的是这个

    class Test{
    public static void main(String[] args) {
        Flower f1 = new Flower();
        Flower f2 = new Gardenia();
        Violet v = new Violet();
        Gardenia g1 = new Gardenia();
        Gardenia g2 = new Gardenia();
        g1 =f1; 
        f1 = g1;
        g1=v;
        v=(Violet)f2;
        g2=f1;
        g1=f2;
    }

}

问题是如何例如g1 = f1;可以写得不一样吗?直接将对象引用分配给另一个对象看起来令人困惑。在此代码中,我们被要求进行适当的投射并评论那些我们无法做任何事情的行(我们不想要ClassCastEcxeption)。例如,在行f1=g1;中,我们可以说Flower f1=g1;

1 个答案:

答案 0 :(得分:0)

很难理解你想知道什么,但你的代码无法编译,因为你不能指定g1 = f1,因为f1是超类Flower的一个对象,而g1是子类。如果你愿意,可以反其道而行之。

为了更清楚并使用简单的语言,如果Flower有一些方法,它的所有子类将具有相同的方法以及一些可以声明的方法。因此,如果您使用Flower对象并尝试将其用作Gardenia对象,则可能存在一些您无法使用的特定方法,因为Flower对象具有比Gardenia对象“更少”的东西。

我建议您详细了解该主题,例如here

编辑:您可以使用Flower f1 = new Gardenia()而不是f1 = g1,您将获得相同的结果。

在此逐个案例:

    g1 =f1; //desn't work
    f1 = g1; // now f1 points to g1 and you can treat the object g1 like a flower object
    g1=v; // doesn't work
    v=(Violet)f2; //desn't work
    g2=f1; //doesn't work, but since now f1 has a Gardenia object, you can make it work doing g2 = (Gardenia) f1 
    g1=f2; //doesn't work