【问题标题】:overriding method in interface and classes接口和类中的重写方法
【发布时间】:2012-03-22 03:48:30
【问题描述】:
 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){}
}

为什么 public void m1() 在类 D 中没有被覆盖,而相同类型的方法 f2() 在类 X2 中被覆盖 在这两种情况下,我们都在覆盖,但为什么在接口情况下类 D 不能,而在第二种情况下,类 X2 可以覆盖。

【问题讨论】:

  • 接口和类中m1的签名不匹配!
  • 这是两种不同的情况,我在问为什么 public void m1() 没有在 D 类中被覆盖,而相同类型的方法 f2() 在 X2 类中被覆盖
  • 抽象类不需要实现接口的方法-stackoverflow.com/questions/197893/…
  • 我猜你打错了。在您的 DG 类中,您必须覆盖 public void m1(),而不是 public void m1(int x)(注意参数)。因为否则,它不是压倒一切的。这是一种完全不同的方法!

标签: java


【解决方案1】:

当有两个方法同名但参数类型(或计数)不同时,这是重载,而不是重载

  • D 本身没有实现A,因为它没有提供m1() 的实现——没有参数。它试图提供一个方法m1(int),但这无助于实现接口——所以它不会编译(因为它不是抽象类)。它当然可以提供两种方法。
  • X1 提供了一个方法f2(),而X2 扩展了X1 并添加了一个新的overload 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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      在 D 类中,您实际上并没有覆盖该方法。由于它是一个抽象方法,因此您应该在 D 类中实现该方法。但是,您正在做的是实现一个新的新方法“void m1(int x)”,而不是实现“void m1()”。您正在重载方法而不是实现/覆盖它。

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

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

      【讨论】:

        【解决方案4】:

        Bot 你的类DG 保持抽象,因为你没有覆盖A.mi1()

        您收到D 的错误,因为您尚未声明它abstract。要么设为abstract,要么覆盖A.mi1()

        在你的第二个 sn-p - 你不是压倒一切,而是重载。这两个是完全不同的功能。不要被他们同名的事实所迷惑。函数名不是唯一进入重载决议的东西,参数也是如此。

        【讨论】:

          猜你喜欢
          • 2019-01-24
          • 1970-01-01
          • 1970-01-01
          • 2019-03-04
          • 2015-11-27
          • 1970-01-01
          • 1970-01-01
          • 2018-07-08
          • 2012-04-09
          相关资源
          最近更新 更多