Java 多态性与动态绑定

Java 多态性与动态绑定,java,polymorphism,dynamic-binding,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 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()); 
是吗

我的编译器不会让我这样编译

动物园里的任何方法都没有额外的好处


但是我认为,由于
z
的实际类型是class
Yoo
,并且
Yoo
继承了
Zoo
Woo
类的所有方法,
z.extra()
将起作用……。

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

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

yoo.extra();
或者

你甚至可以

Zoo zoo = new Yoo();
((Woo) zoo).extra();
留下一行。

另外,假设您要在
Yoo
类中重写
extra
。从上面的第二个示例调用
wyoo.extra()
将从
Yoo
类调用重写版本,因为Java不关心方法的内容,只要该方法是保证存在的。

如果在调用
extra
之前将
z
的类型固定为
Yoo
或强制转换为
Yoo
(正如其他答案所描述的那样),您将能够编译,并且输出应该是

weeyow yow eekzee

在编译时,z的类型是Zoo,它没有“extra”方法。。
weeyow yow eekzee