覆盖哪种方法?

时间:2014-03-12 07:44:55

标签: java methods interface abstract override

Class Arun()方法,界面B也有run()方法。问题很简单,在run()课程中覆盖了Main方法,我们将如何证明这一点?为什么此代码中没有冲突(编译时错误)?

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");
    }
}

7 个答案:

答案 0 :(得分:25)

覆盖run的{​​p> Arun的{​​{1}}已实施。由于B是一个界面,它只会说明您的对象对其他人的行为方式,并且不会强制执行任何行为。

答案 1 :(得分:3)

  

run() 接口B 的方法将在 class Main 已实施    A类重写方法。

添加一个额外点,

你不会在子类run()中编写Main方法,你不会知道"未实现的方法"错误。对于非公共方法,类{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()方法。

答案 2 :(得分:2)

没有冲突,因为两种方法都具有相同的签名。接口中的方法声明不会被覆盖,因为它们没有实现任何内容。因此,在这种情况下,将重写A类中的run方法。

另一方面,当覆盖方法时,鼓励您使用@Override注释,例如

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

答案 3 :(得分:2)

将被称为

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

为什么?

您正在实施run interface B,并且覆盖 A的实施。

如果您删除了上一个run()实施并删除implements B,则会调用run() A

答案 4 :(得分:2)

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

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

// 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 :(得分:1)

查看此链接...

你会比我们所说的更了解...

http://docs.oracle.com/javase/tutorial/java/IandI/override.html

答案 6 :(得分:0)

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

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