在这篇博文中,你将通过实例来学习接口中的默认方法和静态方法的教程。
为什么需要默认方法接口?
缺省方法是java 8版本中引入的功能之一。
在Java 8版本之前,接口只有抽象方法。抽象方法的实现必须由实现该接口的类来提供。
如果任何接口代码被发布,我们就不能改变接口结构。
如果需要对接口进行任何修改,就会导致实现接口的类的代码中断。
接口声明包含抽象方法,这些方法没有实现,正如下面的例子所述。
class ClassTwo implements MyInterface {
public void methodone() {
}
}
interface MyInterface {
public void methodone();
}
在上面的例子中,通过实现MyInterface ,声明了一个class 。这样做效果很好。
现在在接口中再添加一个方法--methodtwo ,如下所示。
interface MyInterface {
public void methodone();
public void methodtwo();
}
在现有的接口中添加新的方法后,ClassTwo ,出现了编译错误,并破坏了功能。
类型ClassTwo 必须实现继承的抽象方法MyInterface.methodtwo() 。解决这个问题的方法是为新方法提供一个实现。
这就迫使客户在接口发生变化时扩展其功能。这与类的设计是矛盾的。
当你实现了新方法后,ClassTwo编译成功。
为了避免这种类型的设计问题,在java8中引入了接口中的Default方法。
默认方法为接口增加了额外的功能,以不破坏实现它的类的结构。
默认方法是向后兼容以前的版本的。
default关键字的重要说明
default是一个关键字,只在java 8版本的接口中起作用。- 接口方法必须以关键字为前缀
default default实现类中的方法不需要提供实现。Default方法可以被重写Default方法提供了向后的兼容性- 这些方法在java中也可以称为
defend或virtual方法。
接口中的默认方法示例
在下面的代码中,methodDefault() 是InterfaceDemo 的默认方法。
在不破坏实现类的结构的情况下,为接口添加了额外的功能。
public class MyClass implements InterfaceDemo {
@Override
public void methodHeader() {
System.out.println("methodHeader Implementation");
}
public static void main(String[] args) {
MyClass myClassObject = new MyClass();
// call interfaec abstract method
myClassObject.methodDefault();
// Call Interface abstract method
myClassObject.methodHeader();
}
}
interface InterfaceDemo {
// This is default method
default void methodDefault() {
System.out.println("Default method");
}
// This is abstract method
void methodHeader();
}
输出
Default method
methodHeader Implementation
java中带有默认方法的接口继承实例
正如你所知,java不支持通过扩展类来实现多重继承,这会导致钻石问题,为了实现多重继承,需要使用多个接口。
在default 关键字的情况下,interfaces ,多重继承会导致方法ambiguity 的问题。
在下面的代码中。
我们定义了两个默认方法名相同的接口,通过实现多个接口创建了一个类,如下图所示。
interface InterfaceOne {
default void method(){
System.out.println("InterfaceOne.method()");
}
}
interface InterfaceTwo {
default void method(){
System.out.println("InterfaceTwo.method()");
}
}
public class ClassOne implements InterfaceOne, InterfaceTwo{
}
这段代码抛出了编译错误,理由是:从InterfaceTwo和InterfaceOne类型中继承了重复的默认方法,名为()和()的方法。对重复的默认方法的修复是覆盖默认方法,如下所示。
public class ClassOne implements InterfaceOne, InterfaceTwo{
public void method(){
System.out.println("class method");
}
}
要调用InterfaceOne的默认方法,在实现的方法中使用super 关键字和方法名。
public void method(){
InterfaceOne.super.method();
}
接口静态方法示例
Static 方法类似于接口中的 default方法。它们在接口中增加了额外的功能,而不会破坏实现类中的代码。静态方法不能在实现类中覆盖。
public class MyClass implements InterfaeDemo {
@Override
public void methodHeader() {
System.out.println("methodHeader Implementation");
}
public static void main(String[] args) {
MyClass myClassObject = new MyClass();
// call interfaec abstract method
myClassObject.methodDefault();
// Call Interface abstract method
myClassObject.methodHeader();
// interface static method is calling
InterfaeDemo.methodStatic();
}
}
interface InterfaeDemo {
// This is default method
default void methodDefault() {
System.out.println("Default Method");
}
static void methodStatic() {
System.out.println("Static Method");
}
// This is abstract method
void methodHeader();
}
输出
Default Method
methodHeader Implementation
Static Method
java8中抽象方法和默认接口方法的区别?
interface ,现在有Default 方法的主体。抽象有具体的方法。但是这两者是不一样的。
一个抽象类有一个构造函数,接口没有构造函数。
抽象类用它们定义了结构化的状态。接口增加了默认实现。两者都是为了不同的目的而定义的。
接口中默认方法和静态方法的区别?
一个static 方法不能在实现类中被重写,默认方法可以在实现类中被重写。
静态方法可以被实现类中的Interface访问,因为这些方法属于Interface。默认方法可以被实现类的对象访问。类和接口包含相同的静态方法名称,但它们并不互相覆盖。