本文讲述了Java教程——Java 接口的默认方法和静态方法!具有很好的参考价值,希望对大家有所帮助。一起跟随六星小编过来看看吧,具体如下:
Java 8是Java语言的一个重要版本,其中引入了许多新特性和改进,其中一个值得关注的特性是接口的默认方法和静态方法。这篇文章将会介绍这些新特性的基本语法、使用场景、作用,并且举例说明。
接口为什么新增了默认方法和静态方法?以前的接口老早就写好了,后面因为各种业务问题,避免不了要修改接口。
在Java 8之前,比如要在一个接口中添加一个抽象方法,那所有的接口实现类都要去实现这个方法,不然就会编译错误,而某些实现类根本就不需要实现这个方法也被迫要写一个空实现,改动会非常大。
所以,接口默认方法就是为了解决这个问题,只要在一个接口添加了一个默认方法,所有的实现类就自动继承,不需要改动任何实现类,也不会影响业务。另外,接口默认方法可以被接口实现类重写。
接口静态方法和默认方法类似,只是接口静态方法不可以被接口实现类重写
接口静态方法只可以直接通过静态方法所在的接口名.静态方法名来调用。
二、基本语法
在Java 8之前,接口只能定义抽象方法,所有的方法都必须由实现该接口的类来实现。但是,在Java 8中,接口可以定义默认方法和静态方法。
默认方法的语法如下:
public interface MyInterface {
default void myMethod() {
// 默认方法的实现代码
}
}
在上面的例子中,myMethod()方法是一个默认方法,它的实现代码是在接口中定义的。注意到默认方法使用了default关键字来修饰。
静态方法的语法如下:
public interface MyInterface {
static void myStaticMethod() {
// 静态方法的实现代码
}
}
在上面的例子中,myStaticMethod()方法是一个静态方法,它的实现代码也是在接口中定义的。注意到静态方法使用了static关键字来修饰。
三、使用场景
默认方法和静态方法的引入是为了解决接口升级的问题。在Java 8之前,如果要给接口添加新的方法,那么所有实现该接口的类都必须重新实现这个接口。但是,在Java 8中,我们可以通过定义默认方法和静态方法来给接口添加新的方法,这样就不会破坏已有代码的兼容性。
默认方法的使用场景包括:
为接口添加新的方法,而不会破坏已有代码的兼容性。
允许接口提供默认实现,从而减少实现类的工作量。
静态方法的使用场景包括:
提供与接口相关的工具方法,这些方法可以在接口中定义为静态方法。
四、作用
默认方法和静态方法的作用是为了提供更加灵活和方便的接口设计。默认方法可以提供接口方法的默认实现,从而减少实现类的工作量。而静态方法可以为接口提供与接口相关的工具方法,这些方法可以直接通过接口名来调用,而不需要创建实现类的实例。
五、使用案例
我们来看一个例子来说明默认方法和静态方法的使用。
假设我们有一个图形接口Shape,该接口定义了计算图形面积的方法getArea():
public interface Shape {
double getArea();
}
现在我们需要为这个接口添加一个新的方法,用来计算图形的周长。在Java 8之前,我们只能向接口中添加新的抽象方法,这会破坏已有代码的兼容性。但是在Java 8中,我们可以使用默认方法来解决这个问题。
首先,我们在Shape接口中添加一个默认方法getPerimeter(),用来计算图形的周长:
public interface Shape {
double getArea();
default double getPerimeter() {
return 0;
}
}
在这个例子中,getPerimeter()方法是一个默认方法,它的实现代码是在接口中定义的。我们可以在该方法中添加计算图形周长的代码。
接下来,我们定义一个圆形类Circle,实现Shape接口并重写getArea()和getPerimeter()方法:
public class Circle implements Shape {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
public double getArea() {
return Math.PI * radius * radius;
}
@Override
public double getPerimeter() {
return 2 * Math.PI * radius;
}
}
在这个例子中,我们实现了Shape接口并重写了getArea()和getPerimeter()方法,其中getPerimeter()方法是在接口中定义的默认方法。现在我们可以创建Circle对象,并调用其getArea()和getPerimeter()方法来计算圆形的面积和周长:
Circle e = new Circle(10);
double area = circle.getArea();
double perimeter = circle.getPerimeter();
System.out.println("Area: " + area);
System.out.println("Perimeter: " + perimeter);
输出结果为:
Area: 314.1592653589793
Perimeter: 62.83185307179586
在这个例子中,我们成功地使用了接口的默认方法来解决接口升级的问题,并且实现了更加灵活和方便的接口设计,下面在体会另一个示例。
public interface Interface1 {
public void method();
default void method1(){
System.out.println("调用I.method1()方法");
}
public static void method2(){
System.out.println("调用I.method2()方法");
}
}
public class Clazz implements Interface1 {
// 类中可以选择性重写接口的默认方法
@Override
public void method1(){
System.out.println("调用Clazz.method2()方法");
}
@Override
public void method() {
System.out.println("method");
}
}
public static void main(String[] args) {
Interface1 c1 = new Clazz();
c1.method1();
Interface1.method2();
}
调用Clazz.method1()方法
调用I.method2()方法
========================
Clazz的method注释将打印如下:
调用I.method1()方法
调用I.method2()方法
更多相关技术内容咨询欢迎前往并持续关注六星社区了解详情。
想高效系统的学习Java编程语言,推荐大家关注一个微信公众号:Java圈子。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Java入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!