Java 8接口与抽象类

时间:2017-11-16 14:01:52

标签: java java-8

我经历了这个问题: Interface with default methods vs Abstract class in Java 8

以下部分对我不清楚:

  

默认方法的约束是它可以实现   仅在调用其他接口方法方面,没有   参考特定实现的状态。所以主要用例   是更高层次和更方便的方法。

我尝试在默认方法中创建具体类(实现)的对象并调用其实例方法,它工作正常。即,我不需要使用Interface类型作为对象的引用。

然后引用的段落是什么意思。

3 个答案:

答案 0 :(得分:11)

该句子意味着在接口内实现default方法,因此它不能访问对象的实际状态,而只能访问接口本身所暴露的内容,因为接口不能声明实例变量。

例如:

abstract class Foo {
 int result;
 int getResult() { return result; }
}

这不能在interface中完成,因为您不能拥有任何成员变量。你唯一能做的就是结合多种接口方法,这就是它被指定为方便/更高级别的方法,例如:

interface Foo {
  void preProcess();
  void process();
  void postProcess();

  default void processAll() {
    preProcess();
    process();
    postProcess();
  }
}

答案 1 :(得分:5)

问题是默认方法只能“看到”接口本身声明的内容 - 而不是在实现类中。在实现此接口的类中声明的任何 state 字段都是无法访问的。但是他们可以访问界面的static final个字段:

interface test {
    static final int x = 3;

    public default void changeIt() {
        System.out.println(x); // this would work
        ++x; // this will fail
    }
}

答案 2 :(得分:-3)

默认方法仅用于获得Backword_Compatibility支持。请注意,默认方法的优先级低于普通方法(或高级方法),因此您无法实现高级方法和便捷方法