以下是场景:
class Canine{
public void roam(){
System.out.println("Canine-Roam");
}
}
public interface Pet{
public abstract void roam();
}
class Dog extends Canine implements Pet{
public void roam(){
System.out.println("Dog Roam");
}
public static void main(String [] args){
Dog adog = new Dog();
adog.roam();
}
}我知道JVM在选择运行哪个方法时不能有任何混淆,也就是说,哪个方法被覆盖。但不管怎样,我还是很困惑。为什么要编译这个程序?
发布于 2012-10-26 18:17:57
不能-同一个方法不能在一个类中存在两次。
接口只是声明了类实现特定方法的要求。它实际上并不创建该方法。
因此,通过继承获得方法实现的类定义了该方法。这个(单个)实现满足了接口的需求。
在您的案例中:
Dog扩展了Canine,所以这意味着来自Canine的roam()方法是可用的,并且将作为Dog对象上的方法公开。如果不是overridden.Dog将用它自己的roam()定义重写超类的方法。这是允许的,并且在Dog上仍然只有一个名为roam()的明确方法-新的override.Dog实现了Pet,这意味着它需要有一个roam()方法。确实如此,所以它是此接口的有效实现。发布于 2012-10-26 18:20:22
你的情况是完全好的,它将运行良好,并输出Dog Roam。这意味着Dog类中的函数运行。
您没有得到任何编译时错误,因为Dog中的方法实现了在接口中声明为的抽象方法,并且恰好此方法的方法签名与父类匹配。
发布于 2012-10-26 18:31:02
我认为你混淆了两件事:
Dog.roam()Canine.roam() Canine.roam() how do you invoke it?请参阅:invoke很明显,您在两个类中有两个roam()“实现”:
Canine.roam()Dog.roam()在同一个类中有两个相同的方法。
因为Dog扩展了Canine,所以Canine.roam()方法被覆盖了。您的main() function 改用 Dog.roam()。
https://stackoverflow.com/questions/13084980
复制相似问题