【问题标题】:Which method is overridden? [duplicate]哪个方法被覆盖? [复制]
【发布时间】:2014-04-16 04:52:44
【问题描述】:

Class Arun()方法,接口B也有run()方法。问题很简单,run() 类中的哪个 run() 方法被覆盖了,我们将如何证明这一点?为什么这段代码没有冲突(编译时错误)?

class A{
    void run(){System.out.println("A class");}
}

interface B{
    void run();
}

class Main extends A implements B{
    public static void main(String args[]){         
        Main m = new Main();
        m.run();
    }

    // Overridding method
    public void run(){
        System.out.println("run method");
    }
}

【问题讨论】:

  • 非常好奇地等待专家解答

标签: java methods interface abstract overriding


【解决方案1】:

Arun 被覆盖,Brun 被实现。由于B 是一个接口,它仅说明您的对象对其他人的行为方式,而不强制执行任何行为本身。

【讨论】:

  • 所以基本上Main中的run覆盖A中的run将同时实现runB
  • 是的。任何使用Main的人都可以通过接口B看到Main会提供一个方法run——这个方法是如何实现的,如果是继承自基类还是由Main实现本身与Main的用户。
【解决方案2】:

run() 接口 B 的方法将由 main 类 实现 A 类重写方法。

加分,

如果您不会在子类Main 中编写run() 方法,您将不会得到众所周知的“未实现方法”错误。对于非公共方法的 A 类的 public 方法也是如此,您将得到编译器错误:继承的方法不能隐藏公共抽象方法。

那是因为methods of interface are public by default 而你不能用default (package private) 访问修饰符隐藏它。

示例:

class A{
    public void run() {
        System.out.println("This method will be inherited.");
    }
}

interface B{
    void run();
}

class Main extends A implements B{
    public static void main(String args[]){         
        Main m = new Main();
        m.run();
    }
}

OUTPUT : This method will be inherited.

在上面的代码实例中,run() 方法继承自类 A,它将实现接口 B 的 run() 方法。

【讨论】:

    【解决方案3】:

    会被调用的是

    public void run(){
        System.out.println("run method");
    }
    

    为什么?

    您正在实现 runinterface B,并且您还覆盖它的 A 实现。

    如果您删除最后一个run() 实现并删除implements B,将调用A 中的run()

    【讨论】:

      【解决方案4】:

      接口B 表示任何实现它的类都必须有一个run 方法。 Main扩展了A,继承了Arun()方法。

      Main 满足B 接口对具有run 方法的要求。然后 Main 中的 run 方法会覆盖它从 A 类中获得的 run() 方法。

      // This is a class with a run method.
      class A{
          void run(){System.out.println("A class");}
      }
      
      // Anything implementing this interface must have a run method.
      interface B{
          void run();
      }
      
      // This class is an extension of A (and therefore has A's run() method)
      // This class implements B and must have a run method, which it does, because it has A's
      class Main extends A implements B{
          public static void main(String args[]){         
              Main m = new Main();
              m.run();
          }
      
          // This method then overrides the run Method it inherited from A
          // And this method meets the requirement set by implementing B.
          public void run(){
              System.out.println("run method");
          }
      }
      

      【讨论】:

      • 这解释了为什么没有编译错误,仍然需要更好的解释
      【解决方案5】:

      没有冲突,因为这两种方法具有相同的签名。接口中的方法声明不会被覆盖,因为它们没有实现任何东西。所以在这种情况下,类 A 中的 run 方法被覆盖。

      另一方面,在重写方法时,我们鼓励您使用@Override 注释,例如

      @Override
      public void run() {
         ....
      }
      

      【讨论】:

      • 鼓励您在实现接口方法时也使用@Override
      【解决方案6】:

      超类的方法总是被称为overridden方法,而子类的方法被称为overriding方法。

      最终方法cannot be 覆盖。 [如果超类的方法是最终的]
      最终方法can 覆盖。 [按语法方式阅读。这个方法在子类中是final的,但是超类的方法不是final]

      【讨论】:

        猜你喜欢
        • 2019-11-27
        • 1970-01-01
        • 1970-01-01
        • 2011-12-13
        • 2014-07-29
        • 2011-06-16
        • 2012-01-24
        • 1970-01-01
        • 2015-12-25
        相关资源
        最近更新 更多