2012-03-04 53 views
0
interface A { public void m1(); } 
**//Gives error** 
    class D implements A { public void m1(int x) { } } 
**//this doen't** 
abstract class G implements A { public void m1(int x) { } } 

我有一个疑问,为什么抽象类是能够覆盖和类d不能压倒一切的方法和类

如果我看到第二种情况

class X1 
{ 
public void f2(){} 
} 

class X2 extends X1 
{**//No error** 
    public void f2(int x){} 
} 

为什么公共无效在类D中,m1()没有得到超类,而类X2中的同一类型的方法在类X2中被重载。 在这两种情况下,我们都是合并的,但为什么在接口的情况下,类D不可以,而在第二种情况下,类X2可以重载。

+2

在接口和类中'm1'的签名不匹配! – jFrenetic 2012-03-04 09:07:48

+0

这些是两种不同的情况,我在问为什么public void m1()在类D中没有得到超类,而同类型的方法f2()在类X2中被重载 – coder25 2012-03-04 09:10:32

+1

抽象类不需要实现接口的方法 - http://stackoverflow.com/questions/197893/why-an-abstract-class-implementing-an-interface-can-miss-the-declaration-impleme – scibuff 2012-03-04 09:13:51

回答

3

当有两个方法具有相同的名称,但不同的参数类型(或计数),这是超载,不覆盖

  • D没有实现A本身,因为它不提供的m1()的实现 - 没有参数。它试图提供一种方法m1(int),但这不会帮助实现接口 - 所以它不会编译(因为它不是一个抽象类)。它当然可以提供两种方法。
  • X1提供了一种方法f2(),和X2延伸X1并增加了一个新的过载f2(int) - 但它不覆盖由X1提供的方法。

特别是,如果你写:

X2 x2 = new X2(); 
x2.f2(10); // Calls X2.f2(int) 
x2.f2(); // Calls X1.f2() 

使用@Override注解使得这一切更加清晰:

class X1 
{ 
    public void f2(){} 
} 

class X2 extends X1 
{ 
    @Override public void f2(int x){} 
} 

现在这给出了一个错误:

error: method does not override or implement a method from a super type 
    @Override public void f2(int x){} 
    ^
1 error 
0

将您的课程编码为DG仍然是抽象的,因为您不是最优的A.mi1()

由于您尚未声明abstract,所以您收到的错误代码为D。要么让它abstract或覆盖A.mi1()

在你的第二个片段中 - 你不是重写,而是重载。这两个是完全不同的功能。不要被他们拥有相同名字的事实所愚弄。函数名称不是唯一进入重载解析的东西,所以参数也是如此。

0

在D类中,实际上并不是重写方法。因为它是一个抽象方法,你应该在类D中实现该方法。然而,你在做什么是实现一个新的方法,'void m1(int x)',而不是实现'void m1()'。你超负荷的方法,而不是执行/覆盖它。

使用抽象类时不会出现错误的原因是您没有义务从它继承的接口实现所有方法。但是,如果它们不是抽象的,你必须在G的子类中实现'void m1()'。

本质上:将接口A中的方法签名更改为:public void m1(int x);它会工作。

0

D和G都不会覆盖A.m1() - 它们“超载”它。因此D缺少执行A.m1()。但是,G仍然是抽象的,所以不需要执行A.m1()

在X2的情况下,您再次超载(未覆盖)f2。但这两种都是具体的方法,所以不会发生错误。