一个类可以继承其他类接口强加的方法构造的实现吗?

时间:2014-08-17 18:36:59

标签: java interface

我正在查看其他人编写的旧代码,我发现有一个类实现了一个接口但没有实现接口中声明的所有方法。

当我尝试使用eclipse在界面中查找方法的实现时,我发现了这一点(突出显示方法并执行ctl + Shit + G =在工作空间中找不到实现)。 仔细研究代码我发现该方法的实现实际上是继承自该类扩展的另一个Abstract类。

这是我所说的简单版本:

interface myInterface{
    int needsTobeImplemeted(int x);
}

abstract class myAbstractClass{
    int needsTobeImplemeted(int x){
        return x;
    }
}

class myClass extends myAbstractClass implements myInterface
{

}

从main prints =>调用方法结果:0

public static void main(String[] args) {
    myInterface interfaceType = new myClass();
    System.out.println("result: " + interfaceType.needToBeImplemeted(0));
}

我的问题是这怎么可能?如果myClass覆盖方法会发生什么:

@override 
int needsTobeImplemeted(int x){
    return x*x;
}

它现在正在实现哪个方法,接口中的on或Abstract类中的方法? 顺便说一下扩展类不一定是抽象类,它可以是一个普通的类;如果它的方法与myInterface中定义的方法具有相同的签名就足够了。

任何解释都将不胜感激;)

覆盖myClass中的方法:

public class myClass extends myAbstractClass implements myInterface {

  @Override
  public int needToBeImplemeted(int x)
  {
    return x*x;
  }
}


public static void main(String[] args) {
    myClass classType = new myClass();
    myAbstractClass abstractType = new myClass();
    myInterface interfaceType = new myClass();

    System.out.println("result: " + classType.needToBeImplemeted(2));
    System.out.println("result: " + abstractType.needToBeImplemeted(2));
    System.out.println("result: " + interfaceType.needToBeImplemeted(2));
}

结果:

结果:4

结果:4

结果:4

3 个答案:

答案 0 :(得分:1)

  

现在正在实现哪种方法,接口上的on或者   抽象类中的一个?

课程不是"实施"一种方法。它"实现"一个界面。实现一个接口只是意味着,"拥有该接口所描述的所有方法"。

在类或其内联树中定义方法的位置并不重要。因此,如果您打算实现接口或抽象方法中的方法,则没有区别。重要的是,是否存在具有该签名的方法。

答案 1 :(得分:0)

实现接口的非抽象类必须具有所有接口方法的实现。它是否实现这些方法或从其超类继承实现并不重要。如果它覆盖了超类的needsTobeImplemeted实现,这意味着在该类的实例上调用needsTobeImplemeted将调用子类的实现。

在您的示例中,interfaceType.needToBeImplemeted(0)返回0,无论您是否在myClass子类中覆盖它,因为0 = 0 * 0。

答案 2 :(得分:0)

myClass实施myInterface,这意味着必须有myInterface描述的行为myClass有这种行为,因为 一个myAbstractClass继承了它的所有方法

回答你的问题:

  

现在正在实现哪种方法,接口上的on或者   抽象类中的一个?

myClass未实现方法本身,它从myAbstractClass继承方法以符合myInterface

如果你这样说:

@Override 
int needsTobeImplemeted(int x){
    return x*x;
}

myClass内,您将覆盖myAbstractClass的实施。