Java中的上传问题?

时间:2011-07-18 05:47:19

标签: java polymorphism upcasting

有人可以解释为什么会发生这种情况:

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 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:2)

这是任何OOP语言的基本功能。这就是为什么C ++中的所有解构器都应该是虚拟的 - 实现多态性。要调用适当的方法。 This是理解其运作方式的好文章

答案 2 :(得分: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参数。

答案 3 :(得分:0)

这就是java的设计工作方式,称为覆盖方法的行为。如果你想在超类中使用该方法,你可以在父类和子类中使用相同签名的方法隐藏 i:e静态方法。