有人可以解释为什么会发生这种情况:
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()
方法执行子类方法,而不是超类方法,即使我正在向上推,也可以看到?
答案 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静态方法。