Java 8接口中的默认方法和静态方法是如何工作的?

3

我一直在努力理解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. 随着默认方法的引入,我们是否还需要抽象类?

P.S.
请随意编辑问题,使其对其他 Stack Overflow 用户更有用。


3
为了让你的问题对其他用户有帮助,请每个帖子限制一个问题。 - Joe C
2
最后的4个问题似乎都涉及到默认方法和接口,因此它们相关。我认为将它们分开发布没有意义,更合理的做法是将它们组合在一起。 - D-Dᴙum
2
@Kerry:第四个问题显然是几个已经存在的问题的副本。这已经清楚地表明为什么一次性问几个完全不同的问题是不好的。所有标记为[tag: java-8]的问题都与Java 8有关,但在不同的帖子中写入不同的问题仍然有意义。 - Holger
2个回答

2
  1. 是的。

  2. Java接口默认方法可以帮助我们在扩展接口时,不用担心会破坏实现类。

如果那些计算机控制的汽车制造商增加了新功能,比如飞行,他们需要指定新的方法来使其他公司(如电子导航仪制造商)适应飞行汽车。这些汽车制造商将在哪里声明这些新的与飞行相关的方法?如果他们将它们添加到原始接口中,那么已经实现这些接口的程序员将不得不重写他们的实现。如果将它们添加为静态方法,则程序员将把它们视为实用方法,而不是基本核心方法。

  1. 据我所知,静态方法不需要被覆盖,因此将其标记为final是一致的。覆盖取决于是否有类的实例。一个静态方法与类的任何实例都没有关联,因此该概念不适用。然而,默认方法必须具有可覆盖属性,正如我上面引用的那样。

  2. 在Java 8中,接口中是否可以有默认构造函数、私有字段和实例成员?


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

list.sort(ordering);

代替
Collections.sort(list, ordering);

好的,你能否详细说明一下他们做了什么来使Java在接口中具有默认实现?我接受所有其他解释。 - Adit A. Pillai
你是在问他们是如何将这个功能添加/实现到Java中的,还是在问他们通过将这个功能添加到Java中获得了什么(我已经回答过了)?@AditA.Pillai - Soner from The Ottoman Empire

1
看起来你有点混淆抽象类和接口。 抽象类: 在抽象类中,我们可以定义抽象方法和非抽象方法。对于抽象方法,我们不需要提供方法的实现;对于非抽象方法,我们需要提供方法的实现。
一个类只能继承一个抽象类。 接口: 在 Java 7 以前,接口没有方法体,但是随着 Java 8 的到来,我们可以使用默认关键字指定方法体。
一个类可以实现多个接口。
当需要一个类符合两个实体的特征时,我们可以使用接口。现在有了默认关键字,我们可以得到一个默认方法体(由接口本身提供的方法)供我们的类使用,我们可以选择是否覆盖并给出新的方法定义。 底线 使用接口还是抽象类纯粹取决于具体情况。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接