page contents

Java教程——Java 接口的默认方法和静态方法

Java 8是Java语言的一个重要版本,其中引入了许多新特性和改进,其中一个值得关注的特性是接口的默认方法和静态方法。这篇文章将会介绍这些新特性的基本语法、使用场景、作用,并且举例说明。

attachments-2023-09-MC5em9iw64f685189d1cd.jpg

本文讲述了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入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。

attachments-2023-03-2AoKIjPQ64014b4ad30a3.jpg

  • 发表于 2023-09-05 09:32
  • 阅读 ( 182 )
  • 分类:Java开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
小柒
小柒

1316 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1316 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章