我正在查看其他人编写的旧代码,我发现有一个类实现了一个接口但没有实现接口中声明的所有方法。
当我尝试使用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
答案 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
的实施。