我一直试图了解默认和静态方法在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 { }
我想知道幕后的真实情况:
public static void main(String[] args){
Car car = new Benz();
car.drive();
System.out.println(Car.getWheelCount());
System.out.println(Car.wheelCount);
}
实例的默认方法?Car
,这与我上面的问题有任何关联。 P.S。
请随时编辑问题,使其对SO用户更有用。
答案 0 :(得分:2)
是
Java接口默认方法将帮助我们扩展接口,而不必担心会破坏实现类。
如果那些计算机控制的汽车制造商增加了新的东西 功能,如飞行,到他们的车?这些制造商 需要指定新的方法来启用其他公司(例如 电子制导仪器制造商)以适应他们的软件 飞车。这些汽车制造商将在哪里宣布这些新产品 与飞行有关的方法?如果他们将它们添加到原始界面, 然后,实现这些接口的程序员必须这样做 重写他们的实现。如果他们将它们添加为静态方法, 然后程序员会将它们视为实用方法,而不是 必不可少的核心方法。
AFAIK,静态方法不需要覆盖,因此静态方法的final
是一致的。覆盖取决于具有类的实例。 静态方法与类的任何实例都没有关联,因此该概念不适用。但是,默认方法必须具有可覆盖的属性,如上所述。
你能在Java 8的界面中拥有默认的ctor,私有字段,实例成员吗?
我喜欢使用默认方法,
list.sort(ordering);
而不是
Collections.sort(list, ordering);
答案 1 :(得分:0)
看来你似乎在抽象类和接口之间有点混淆。
抽象类:
在抽象类中,我们可以抽象方法和非抽象方法。对于抽象方法,我不需要有一个方法定义,对于非抽象方法,我们需要有一个方法体。
一个类,仅限于抽象类。
接口:
旧时代的接口(Java 7)从未有过方法体,随着java 8的出现,我们可以使用default关键字指定方法体。
一个类可以实现多个接口。
因此,当我们需要一个类来符合两个实体的特性时,我们可能会使用这些接口。现在使用默认关键字,我们得到接口本身提供的类的默认方法体(接口方法),我们可能会或可能不会选择覆盖并给出新的方法定义。
底线
是否纯粹使用界面或抽象类取决于情境需要。