首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >同一个方法可以通过继承和接口在一个类中存在两次吗?

同一个方法可以通过继承和接口在一个类中存在两次吗?
EN

Stack Overflow用户
提问于 2012-10-26 18:15:26
回答 4查看 2.4K关注 0票数 2

以下是场景:

代码语言:javascript
复制
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在选择运行哪个方法时不能有任何混淆,也就是说,哪个方法被覆盖。但不管怎样,我还是很困惑。为什么要编译这个程序?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-10-26 18:17:57

不能-同一个方法不能在一个类中存在两次。

接口只是声明了类实现特定方法的要求。它实际上并不创建该方法。

因此,通过继承获得方法实现的类定义了该方法。这个(单个)实现满足了接口的需求。

在您的案例中:

  1. Dog扩展了Canine,所以这意味着来自Canineroam()方法是可用的,并且将作为Dog对象上的方法公开。如果不是overridden.
  2. But,那么Dog将用它自己的roam()定义重写超类的方法。这是允许的,并且在Dog上仍然只有一个名为roam()的明确方法-新的override.
  3. Dog实现了Pet,这意味着它需要有一个roam()方法。确实如此,所以它是此接口的有效实现。
票数 8
EN

Stack Overflow用户

发布于 2012-10-26 18:20:22

你的情况是完全好的,它将运行良好,并输出Dog Roam。这意味着Dog类中的函数运行。

您没有得到任何编译时错误,因为Dog中的方法实现了在接口中声明为的抽象方法,并且恰好此方法的方法签名与父类匹配。

票数 2
EN

Stack Overflow用户

发布于 2012-10-26 18:31:02

我认为你混淆了两件事:

  • Implementation:和Dog.roam()
  • Interface:完成了什么?请参阅:Canine.roam() Canine.roam() how do you invoke it?请参阅:invoke

很明显,您在两个类中有两个roam()“实现”:

  • Canine.roam()
  • Dog.roam()

在同一个类中有两个相同的方法。

因为Dog扩展了Canine,所以Canine.roam()方法被覆盖了。您的main() function 改用 Dog.roam()

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13084980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档