Java中向上转型出现问题?

4

请问有人能解释一下为什么会发生这种情况吗:

class Apple {

   String type;

   setType(){
      System.out.println("inside apple class");
      this.type = "apple";
   }

}

class RedApple extends Apple {

    String type;

    setType() {
      System.out.println("inside red-apple class");
       this.type = "redapple";
    }
}

int main {

    RedApple red = new RedApple();
    Apple apple = (Apple) red;
    apple.setType();

}

但是生成的输出是:
"inside red-apple class”

为什么在进行向上转型时,即使已经向上转型,.setType() 方法仍然执行子类方法而不是父类方法?
4个回答

6

这是因为在Java中,多态性的工作方式就是:总是使用方法最终派生版本,它会覆盖其他版本。获取基类版本的唯一方法是在最终派生覆盖中使用 super.setType


2

这是任何面向对象编程语言的基本特性。这就是为什么C++中所有析构函数都应该是虚拟的 - 以实现多态性,从而调用适当的方法。 这篇文章是理解它如何工作的好材料。


1

这是多态性,您已经覆盖了该方法,因此无论何时在该对象上调用该方法,即使将其强制转换为超类,也将调用最子级的方法。

但是,向上转型确实有影响的一个例子在这里:

class MyClass {
    static void doSomething(Apple apple) { System.out.println("Apple"); }
    static void doSomething(RedApple apple) { System.out.println("RedApple"); }
}
...
RedApple apple = new RedApple();
MyClass.doSomething(apple);
MyClass.doSomething((Apple)apple);

输出:

RedApple
Apple

由于我们将其向上转型为Apple,因此最匹配的方法是具有Apple参数的方法。


0

这就是Java的设计方式,被称为方法重写行为。如果你想在父类中使用该方法,可以使用方法隐藏,即在父类和子类中都使用相同签名的静态方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接