【问题标题】:How do default and static methods work in java 8 interfaces?默认和静态方法如何在 java 8 接口中工作?
【发布时间】:2017-09-10 09:34:01
【问题描述】:

我一直在尝试了解 defaultstatic 方法在 java 8 中的实际工作原理?

考虑以下接口:

public interface Car {

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

  static int getWheelCount(){
    return wheelCount;
  }

  int wheelCount = 7;
}

以及以下实现:

public class Benz implements Car { }

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

public static void main(String[] args){
  Car car = new Benz();
  car.drive();
  System.out.println(Car.getWheelCount());
  System.out.println(Car.wheelCount);
}

我想知道幕后到底发生了什么:

  1. 是否以类似于抽象类的工作方式对Car 的实例调用默认方法?
  2. 为了支持接口中的默认和静态方法,该语言需要哪些新功能/修改?
  3. 我知道默认情况下,界面中的所有字段都默认为public static final,这与我的上述问题有什么关系。
  4. 随着默认方法的引入,我们不再需要抽象类了吗?

附言
请随时编辑问题,使其对其他 SO 用户更有用。

【问题讨论】:

  • 为了让您的问题对其他用户有所帮助,请将它们限制在每个帖子中。
  • 最后的 4 个问题似乎都与默认方法和接口有关。我认为将它们包含在单独的帖子中没有意义,将它们组合在一起更有意义。
  • @Kerry:第四个问题显然是几个已经存在的问题的重复。这已经说明了为什么一次问几个完全不同的问题是不好的。所有标有java-8 的问题都与它们引用 java 8 相关,但在不同的帖子中写不同的问题仍然是有意义的。

标签: java java-8 jls


【解决方案1】:
  1. 是的。

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

如果那些电脑控制的汽车制造商添加新的 功能,例如飞行,到他们的汽车?这些厂商 将需要指定新的方法来支持其他公司(例如 电子制导仪器制造商)调整他们的软件 到飞行汽车。这些汽车制造商将在哪里宣布这些新的 飞行相关的方法?如果他们将它们添加到原来的界面中, 那么已经实现这些接口的程序员将不得不 重写他们的实现。如果他们将它们添加为静态方法, 那么程序员会将它们视为实用方法,而不是 必不可少的核心方法。

  1. AFAIK,静态方法 不需要重写,所以 final 的静态方法是一致的。覆盖取决于拥有一个类的实例。 静态方法 不与类的任何实例相关联,因此该概念不适用。但是,默认方法必须具有我上面引用的可覆盖属性。

  2. 你能在 Java 8 的接口中拥有默认 ctor、私有字段、实例成员吗?


感谢默认方法,我喜欢使用,

list.sort(ordering);

而不是

Collections.sort(list, ordering);

【讨论】:

  • 很公平,您能否详细说明他们为使 java 在接口中具有默认实现所做的工作?我接受所有其他解释。
  • 您是在问 “他们如何向 Java 添加/实现该功能”“通过向 Java 添加该功能可以获得什么(我已经回答过) )" ? @AditA.Pillai
【解决方案2】:

您似乎对抽象类和接口有点困惑。

抽象类:

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

仅在抽象类上扩展的类。

接口:

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

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

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

底线

使用接口还是抽象类,完全看情况需要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2018-01-11
    • 2021-06-02
    • 2015-03-06
    • 1970-01-01
    • 2014-06-06
    • 2018-01-28
    相关资源
    最近更新 更多