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

4 回答 4

5

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

于 2011-07-18T05:49:27.990 回答
2

这是任何 OOP 语言的基本特征。这就是为什么 C++ 中的所有解构器都应该是虚拟的——以实现多态性。使适当的方法被调用。 是一篇很好的文章,可以理解它是如何工作的

于 2011-07-18T05:55:59.757 回答
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 参数的方法。

于 2011-07-18T05:58:12.053 回答
0

这就是 java 被设计为如何工作的方式,这被称为方法的覆盖行为。如果您想在超类中拥有该方法,则可以在具有相同签名的父类和子类中使用方法隐藏即静态方法。

于 2011-07-18T06:53:09.137 回答