为什么这个程序会输出" A类"?
abstract class A {
public void abc() {
System.out.println("Class A");
}
}
interface B {
default void abc() {
System.out.println("Interface B");
}
}
public class Test extends A implements B {
public static void main(String[] args) {
Test t = new Test();
t.abc();
}
}
任何人都可以解释一下吗?
答案 0 :(得分:7)
虽然抽象类和接口都有相同的方法,但抽象类方法在运行时选择时具有较高的偏好。
以下是JLS on Method invocation principles
有可能没有最具体的方法,因为有两种或更多种方法是最具体的。在这种情况下:
如果所有最具体的特定方法都具有覆盖等效签名(§8.4.2),那么:
如果具体的一个最具体的方法是具体的(即非抽象或默认),则它是最具体的方法。
否则,如果所有最大特定方法都是抽象的或默认的,并且所有最大特定方法的签名都具有相同的擦除(§4.6),那么最具体的方法是在最大特定的子集中任意选择的。具有最特定返回类型的方法。
在这种情况下,最具体的方法被认为是抽象的。此外,当且仅当在每个最大特定方法的throws子句中声明了该异常或其擦除时,才会考虑使用最具体的方法抛出一个已检查的异常。
否则,方法调用不明确,并发生编译时错误。
答案 1 :(得分:0)
当你声明你正在实现一个接口时,它就像说:“我将为这个接口中声明的所有方法做一个实现”。 当您扩展一个抽象类时,您会说:“我将在此类中实现所有抽象方法并继承所有非抽象方法”。
因此,您继承了已定义的方法以满足接口的需求,继承覆盖了接口的默认值。
答案 2 :(得分:-2)
编辑:我今天学到了一些东西。抽象方法在运行时选择具有较高的偏好。
接口是抽象方法的集合。 >>
System.out.println("Interface B");
语句不是继承的。
System.out.println("Class A");
是Test t实例中继承的内容,因为它是抽象的sand具有更高的偏好。