多态性与动态绑定

时间:2015-07-16 00:47:03

标签: java polymorphism dynamic-binding

假设我们有三个课程如下

public class Woo extends Zoo {
    public String one() {
        return "wee" + this.two();
    }
    public String extra() {
        return "eek" + this.one();
    }
}

public class Zoo {
    public String one() {
        return "zee";
    }
public String two() {
        return "zow";
    }
}

public class Yoo extends Woo {
    public String two() {
        return "yow";
    }
}

假设我们做了变量声明:

 Zoo z = new Yoo();

的输出是什么?
System.out.println(z.one() + " " + z.two() + " " + z.extra()); 

是?

我的编译器不会让我编译说

  

Zoo中没有方法有额外的

但我认为,因为z的实际类型是类Yoo,并且Yoo继承了ZooWoo类的所有方法, z.extra()会起作用吗?

2 个答案:

答案 0 :(得分:2)

即使您为z指定了python类型的值,它仍然是Yoo个对象。因此,Java无法知道Zoo方法。您必须将z转换为extraYoo才能访问该方法。例如:

Woo

或者...

Zoo zoo = new Yoo();
Yoo yoo = (Yoo) zoo;

yoo.extra();

你甚至可以做到

Zoo zoo = new Yoo();
Woo wyoo = (Woo) zoo;

wyoo.extra();

并省略一条线。

<小时/> 另外,假设您要覆盖Zoo zoo = new Yoo(); ((Woo) zoo).extra(); 课程中的extra。从上面的第二个示例调用Yoo将调用wyoo.extra()类中的重写版本,因为Java并不关心方法的内容,只是保证方法存在。< p>

答案 1 :(得分:0)

如果您在调用z之前将Yoo的类型修改为Yoo或投放到extra(正如其他答案描述的那样),您将能够编译,输出应该是

weeyow yow eekzee