有三个班级
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;
。
答案 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