父类和实现接口中具有相同名称的静态和非静态方法

时间:2017-02-12 08:07:00

标签: java inheritance static-methods

我不是在询问界面和抽象类之间的区别。

单独工作成功,对吧?

interface Inter {
    public void fun();
}

abstract class Am {
    public static void fun() {
        System.out.println("Abc");
    }
}

public class Ov extends Am implements Inter {
    public static void main(String[] args) {
        Am.fun();
    }
}

为什么会发生冲突?

2 个答案:

答案 0 :(得分:13)

static和非class方法在同一static中的名称不能相同。这是因为您可以使用引用同时访问static和非static方法,编译器将无法决定您是要调用static方法还是非{{ 1}}方法。

请考虑以下代码:

Ov ov = new Ov();
ov.fun(); //compiler doesn't know whether to call the static or the non static fun method.

Java 允许使用引用调用static方法的原因是允许开发人员将static方法更改为非static方法方法无缝。

答案 1 :(得分:2)

我们必须编写代码,以便语法正确。同样重要的是要理解我们的代码不会给编译器带来任何歧义。如果我们有任何这种歧义,语言设计者已经注意不允许这样的代码编译。

一个类从其超类继承行为。只需使用类名和实例即可访问静态方法。假设存在具有相同名称和签名的方法(static关键字除外),在实例上调用该方法将使编译器进行折腾。它将如何决定程序员打算做什么,以及他或她打算调用的两种方法?因此,语言设计者决定将此案例导致编译错误。

根据

http://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.4.8.2

  
    

如果C类声明或继承静态方法m,则m被称为隐藏任何方法m',其中m的签名是m'中签名的子签名(第8.4.2节),在超类中和C的超级接口,否则C中的代码可以访问它们。     如果静态方法隐藏实例方法,则为编译时错误。

  
public class Ov extends Am implements Inter {
    public static void main(String[] args) {
        Ov.fun(); //static method is intended to call, fun is allowed to be invoked from sub class.
        Ov obj = new Ov();

        obj.fun(); //** now this is ambiguity, static method can 
                   //be invoked using an instance, but as there is  
                 //an instance method also hence this line is ambiguous and hence this scenario results in compile time error.**
    }
}