【问题标题】:Direct Java casting using obj1=obj2;使用 obj1=obj2 直接进行 Java 转换;
【发布时间】:2016-12-13 00:43:28
【问题描述】:

一共有三个类

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;

【问题讨论】:

  • 你的意思是g1 = (Gardenia)f2;?不清楚你在问什么。
  • 我的意思是在分配了f1=g1; 之后,我们可以像Flower f1= new Gardenia();这样写这个分配吗?之后,f1 将是指向 Gardenia();? 的 Flower 类型的实例

标签: java inheritance casting reference


【解决方案1】:

很难理解您想知道的内容,但是您的代码无法编译,因为您无法分配 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

【讨论】:

  • 我知道有一个超类type 持有一个子类实例,我将无法使用子类的某些方法。直接指向让我感到困惑。我想要一个像Flower f1= new Gardenia(); 这样的明确任务来很好地理解会发生什么。在我发布的代码中没有这样的东西。所以我从上面的代码中询问每个正确(直接)分配之后的类型和实例将指向什么。
猜你喜欢
  • 1970-01-01
  • 2010-10-18
  • 2013-09-26
  • 1970-01-01
  • 1970-01-01
  • 2012-07-30
  • 2019-09-05
  • 2018-04-27
  • 1970-01-01
相关资源
最近更新 更多