我不是在询问界面和抽象类之间的区别。
单独工作成功,对吧?
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();
}
}
为什么会发生冲突?
答案 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.**
}
}