"默认" (界面)工作?

时间:2015-10-09 10:44:38

标签: java

为什么这个程序会输出" 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();
      }
    }

任何人都可以解释一下吗?

3 个答案:

答案 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具有更高的偏好。