默认和静态方法如何在java 8接口中工作?

时间:2017-09-10 09:34:02

标签: java java-8 jls

我一直试图了解默认静态方法在java 8中的实际工作方式?

考虑以下界面:

Mutex

以及以下实施:

public interface Car {

  default void drive() {
    System.out.println("Default Driving");
  }

  static int getWheelCount(){
    return wheelCount;
  }

  int wheelCount = 7;
}

现在,如果我转到我的主要方法并写下:

public class Benz implements Car { }

我想知道幕后的真实情况:

  1. 是否以类似于抽象类的工作方式调用public static void main(String[] args){ Car car = new Benz(); car.drive(); System.out.println(Car.getWheelCount()); System.out.println(Car.wheelCount); } 实例的默认方法?
  2. 为了支持接口中的默认和静态方法,语言需要哪些新功能/修改?
  3. 我知道默认情况下,界面中的所有字段都是默认Car,这与我上面的问题有任何关联。
  4. 随着默认方法的引入,我们是否还需要抽象类?
  5. P.S。
    请随时编辑问题,使其对SO用户更有用。

2 个答案:

答案 0 :(得分:2)

  1. Java接口默认方法将帮助我们扩展接口,而不必担心会破坏实现类。

  2.   

    如果那些计算机控制的汽车制造商增加了新的东西   功能,如飞行,到他们的车?这些制造商   需要指定新的方法来启用其他公司(例如   电子制导仪器制造商)以适应他们的软件   飞车。这些汽车制造商将在哪里宣布这些新产品   与飞行有关的方法?如果他们将它们添加到原始界面,   然后,实现这些接口的程序员必须这样做   重写他们的实现。如果他们将它们添加为静态方法,   然后程序员会将它们视为实用方法,而不是   必不可少的核心方法。

    1. AFAIK,静态方法不需要覆盖,因此静态方法的final是一致的。覆盖取决于具有类的实例。 静态方法与类的任何实例都没有关联,因此该概念不适用。但是,默认方法必须具有可覆盖的属性,如上所述。

    2. 你能在Java 8的界面中拥有默认的ctor,私有字段,实例成员吗?

    3. 我喜欢使用默认方法,

      list.sort(ordering);
      

      而不是

      Collections.sort(list, ordering);
      

答案 1 :(得分:0)

看来你似乎在抽象类和接口之间有点混淆。

抽象类:

在抽象类中,我们可以抽象方法和非抽象方法。对于抽象方法,我不需要有一个方法定义,对于非抽象方法,我们需要有一个方法体。

一个类,仅限于抽象类。

接口:

旧时代的接口(Java 7)从未有过方法体,随着java 8的出现,我们可以使用default关键字指定方法体。

一个类可以实现多个接口。

因此,当我们需要一个类来符合两个实体的特性时,我们可能会使用这些接口。现在使用默认关键字,我们得到接口本身提供的类的默认方法体(接口方法),我们可能会或可能不会选择覆盖并给出新的方法定义。

底线

是否纯粹使用界面或抽象类取决于情境需要。