返回顶部
首页 > 资讯 > 后端开发 > Python >Java8接口之默认方法与静态方法详解
  • 621
分享到

Java8接口之默认方法与静态方法详解

2024-04-02 19:04:59 621人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录前言为什么选择默认方法?Java 8示例:接口中的默认方法Java 8示例:接口中的静态方法Java 8 - 抽象类与接口总结前言 在Java8之前,java中的接口只能有抽象方

前言

在Java8之前,java中的接口只能有抽象方法。默认情况下,接口的所有方法都是公共和抽象的。Java8允许接口具有默认和静态方法。我们在接口中使用默认方法的原因是,允许开发人员向接口添加新方法,而不会影响实现这些接口的类。

为什么选择默认方法?

例如,如果A、B、C和D等几个类实现了一个接口XYZInterface,那么如果我们向XYZInterface添加一个新方法,我们必须更改实现该接口的所有类(A、B、C和D)中的代码。在本例中,我们只有四个类实现了我们想要更改的接口,但是想象一下,如果有数百个类实现了一个接口,那么几乎不可能更改所有这些类中的代码。这就是为什么在Java8中,我们有了一个新概念“默认方法”。这些方法可以添加到任何现有接口中,我们不需要强制在实现类中实现这些方法,因此我们可以在不破坏代码的情况下将这些默认方法添加到现有接口中。

我们可以说,java 8中引入了默认方法的概念,以便在现有接口中添加新方法,从而使它们向后兼容。向后兼容性是在不破坏旧代码的情况下添加新功能。

接口中的静态方法与默认方法类似,只是我们不能在实现这些接口的类中重写这些方法。

Java 8示例:接口中的默认方法

MyInterface中的方法newMethod()是默认方法,这意味着我们不需要在实现类示例中实现该方法。通过这种方式,我们可以将默认方法添加到现有接口中,而不必担心实现这些接口的类。

interface MyInterface{  
    
    default void newMethod(){  
        System.out.println("Newly added default method");  
    }  
    
    void existingMethod(String str);  
}  
public class Example implements MyInterface{ 
    // implementing abstract method
    public void existingMethod(String str){           
        System.out.println("String is: "+str);  
    }  
    public static void main(String[] args) {  
        Example obj = new Example();
        
        //calling the default method of interface
        obj.newMethod();     
        //calling the abstract method of interface
        obj.existingMethod("Java 8 is easy to learn"); 
  
    }  
}

输出:

Newly added default method
String is: Java 8 is easy to learn

Java 8示例:接口中的静态方法

如上所述,接口中的静态方法与默认方法类似,因此我们不需要在实现类中实现它们。我们可以安全地将它们添加到现有接口中,而无需更改实现类中的代码。由于这些方法是静态的,我们不能在实现类中重写它们。

interface MyInterface{  
    
    default void newMethod(){  
        System.out.println("Newly added default method");  
    }  
    
    
    static void anotherNewMethod(){
        System.out.println("Newly added static method");
    }
    
    void existingMethod(String str);  
}  
public class Example implements MyInterface{ 
    // implementing abstract method
    public void existingMethod(String str){           
        System.out.println("String is: "+str);  
    }  
    public static void main(String[] args) {  
        Example obj = new Example();
        
        //calling the default method of interface
        obj.newMethod();     
        //calling the static method of interface
        MyInterface.anotherNewMethod();
        //calling the abstract method of interface
        obj.existingMethod("Java 8 is easy to learn"); 
    }  
}

输出:

Newly added default method
Newly added static method
String is: Java 8 is easy to learn

Java 8 - 抽象类与接口

随着接口中默认方法的引入,抽象类似乎与Java8中的接口相同。然而,这并不是完全正确的,尽管我们现在可以像抽象类一样在接口中有具体的方法(带主体的方法),但这并不意味着它们是相同的。它们之间仍然没有什么区别,其中之一是抽象类可以有构造函数,而在接口中我们不能有构造函数。

接口的目的是提供完全抽象,而抽象类的目的是提供部分抽象。这仍然适用。界面就像是类的蓝图,通过引入默认方法,您可以简单地说,我们可以在界面中添加附加功能,而不会影响最终用户类。

默认方法和多重继承

当我们有两个具有相同签名的默认方法的接口时,可能会出现多重继承问题。让我们举个例子。

interface MyInterface{  
    default void newMethod(){  
        System.out.println("Newly added default method");  
    }  
    void existingMethod(String str);  
}  
interface MyInterface2{  
    default void newMethod(){  
        System.out.println("Newly added default method");  
    }  
    void disp(String str);  
} 
public class Example implements MyInterface, MyInterface2{ 
    // implementing abstract methods
    public void existingMethod(String str){           
        System.out.println("String is: "+str);  
    }  
    public void disp(String str){
        System.out.println("String is: "+str); 
    }
    
    public static void main(String[] args) {  
        Example obj = new Example();
        //calling the default method of interface
        obj.newMethod();     
    }  
}

输出:

Error: Duplicate default methods named newMethod with the parameters () and () are inherited from the types MyInterface2 and MyInterface

这是因为我们在接口中都有相同的方法,而编译器不确定要调用哪个方法。

如何解决这个问题?

为了解决这个问题,我们可以在实现类中实现这个方法,如下所示:

interface MyInterface{  
    default void newMethod(){  
        System.out.println("Newly added default method");  
    }  
    void existingMethod(String str);  
}  
interface MyInterface2{  
     
    default void newMethod(){  
        System.out.println("Newly added default method");  
    }  
    void disp(String str);  
} 
public class Example implements MyInterface, MyInterface2{ 
    // implementing abstract methods
    public void existingMethod(String str){           
        System.out.println("String is: "+str);  
    }  
    public void disp(String str){
        System.out.println("String is: "+str); 
    }
    //Implementation of duplicate default method
    public void newMethod(){  
        System.out.println("Implementation of default method");  
    }  
    public static void main(String[] args) {  
        Example obj = new Example();
        //calling the default method of interface
        obj.newMethod();     
    }  
}

输出:

Implementation of default method

首先我们要总体说一下,为什么要有这两个方法存在:

(1)原先的jdk7之类的,它们接口中的方法都是抽象方法,没有具体的实现,就相当于定义好了这个接口有哪些功能,却没有具体定义功能是怎么实现的,通常由接口的实现类来做具体功能实现。那么,如果面向接口编程,大家已经根据自己需要通过继承接口的方式来实现了自己的功能,突然有一天,产品提需求了,你需要给所有接口的实现类都添加一个新的功能即一个新的方法实现,而且这个方法可能大家都是一样的,那咋办?

jdk8以前的做法肯定是现在接口中定义这个抽象方法,然后所有实现类必须实现这个方法(不然接口中多出一个抽象方法,其他类都没有实现,编译是会报错的),如果实现类比较多,那改起来会很麻烦,这种情况下是不利于维护的。

那么我们在jdk8中就有了好的解决方式,就是在接口中加一个默认方法,这个默认方法有具体实现,这样就不用去修改实现类啦,很省事。

总结

到此这篇关于Java8接口之默认方法与静态方法的文章就介绍到这了,更多相关Java8默认方法与静态方法内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java8接口之默认方法与静态方法详解

本文链接: https://lsjlt.com/news/144364.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java8接口之默认方法与静态方法详解
    目录前言为什么选择默认方法?Java 8示例:接口中的默认方法Java 8示例:接口中的静态方法Java 8 - 抽象类与接口总结前言 在Java8之前,java中的接口只能有抽象方...
    99+
    2024-04-02
  • Java8 接口默认方法和静态方法
    目录1、默认接口方法2、静态接口方法3、两者的场景差异前些日有同学问我Java接口中为什么要增加一个默认方法。在Java 8 中不单单增加了默认接口方法还增加了静态接口方法。今天就来...
    99+
    2024-04-02
  • 详解Java8中接口的默认方法和静态方法
    目录一、基本语法二、使用场景三、作用四、使用案例三、总结Java 8是Java语言的一个重要版本,其中引入了许多新特性和改进,其中一个值得关注的特性是接口的默认方法和静态方法。这篇文...
    99+
    2023-05-20
    Java8接口默认方法 Java8接口静态方法 Java8接口 Java8新特性
  • Java8新特性之接口中的默认方法和静态方法详解
    目录一、前言二、为什么在 Java 接口中使用默认方法?三、为什么在 Java 接口中使用静态方法?四、场景一:接口中的默认方法五、场景二:接口中的静态方法六、情景三:多重继承 - ...
    99+
    2024-04-02
  • 如何理解Java8接口中的默认方法和静态方法
    本篇内容介绍了“如何理解Java8接口中的默认方法和静态方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.接口中的默认方法和静态方法Ja...
    99+
    2023-06-25
  • 深入理解Java8新特性之接口中的默认方法和静态方法
    1.接口中的默认方法和静态方法 Java 8中允许接口中包含具有具体实现的方法,该方法称为 “默认方法” ,默认方法使用 default 关键字修饰。 接口默认方法的 ” 类优先 ”...
    99+
    2024-04-02
  • Java8新特性之接口中默认方法和静态方法的示例分析
    这篇文章给大家分享的是有关Java8新特性之接口中默认方法和静态方法的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、前言Java 8 引入了默认方法以及可以在接口中定义的静态方法。默认方法是一个普通的...
    99+
    2023-06-15
  • Java8新特性之默认方法详解
    目录简介正文什么是默认方法为啥要提供默认方法呢?如果不提供呢?主要针对谁?实现了默认方法的接口和抽象类有区别吗是不是可以说Java现在也实现了多重继承?总结简介 在Java之前,我们...
    99+
    2024-04-02
  • 一文教你使用Java8中的静态接口方法
    一文教你使用Java8中的静态接口方法?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。默认方法默认方法让我们能给我们的软件库的接口增加新的方法,并且能保证对使用这个接口的老版本代...
    99+
    2023-05-31
    java8 静态接口 ava
  • SpringBootsecurity默认拦截静态资源的解决方法
    Spring Boot security 会默认登陆之前拦截全部css, js,img等动态资源,导致我们的公开主页在登陆之前很丑陋 像这样: 网上很多解决办法都过时了比如还在使用...
    99+
    2023-03-19
    Spring Boot security拦截静态资源 Spring Boot security静态资源
  • Java8的默认方法是什么
    这篇文章主要介绍了Java8的默认方法是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java8的默认方法是什么文章都会有所收获,下面我们一起来看看吧。什么是默认方法默认方法是接口中用default修饰的方...
    99+
    2023-06-29
  • java接口使用默认方法的讲解
    1、接口中默认方法的格式: public default返回值类型方法名(参数列表) { } 2、接口中默认方法的注意事项: 默认的方法不是抽象的方法,所以不重写。但是可以重写...
    99+
    2024-04-02
  • PHP中的静态方法与抽象方法详解
    PHP作为一种常用的服务器端脚本语言,有许多高级特性可供开发者灵活运用。其中,静态方法和抽象方法在面向对象编程中起着重要的作用。本文将深入探讨PHP中静态方法和抽象方法的概念、用法和实...
    99+
    2024-03-05
    php 静态方法 抽象方法
  • Java8为什么会有默认方法
    这篇文章将为大家详细讲解有关Java8为什么会有默认方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。前言在Java 8之前,默认情况下,接口中的所有方法都是公共的和抽象的。但是这一限制在Java 8中被...
    99+
    2023-06-06
  • 详解Python中的静态方法与类成员方法
    前言 因为Python的水平目前一直是处于能用阶段,平时写的脚本使用的Python的写法也比较的简单,没有写过稍微大一点的项目。对Python中的类,类之间的组织关系,整个项目中类之间如何耦合还缺乏认识。打...
    99+
    2022-06-04
    方法 静态 详解
  • python类方法和静态方法详解
    目录类方法静态方法1特点2使用场景总结类方法 需要用装饰器@classmethod来标识其为类方法,对于类方法,第一个参数必须是类对象,一般以cls作为参数 使用场景 1当方法中需要...
    99+
    2024-04-02
  • java接口怎么使用默认方法
    本篇内容介绍了“java接口怎么使用默认方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、接口中默认方法的格式:public ...
    99+
    2023-06-30
  • nginx修改默认端口方法图文详解
    1、进入nginx.conf文件 2、修改listen后的默认端口号改为想改的端口号(如下图) 3、设置防火墙允许通过修改的端口号 1、firewall-cmd --zone=pu...
    99+
    2024-04-02
  • JVM 方法调用之静态分派(详解)
    分派(Dispatch)可能是静态也可能是动态的,根据分派依据的宗量数可分为单分派和多分派。这两种分派方式的两两组合就构成了静态单分派,静态多分派,动态单分派,动态多分派这4种组合。本章讲静态分派。1、静态分派所有依赖静态类型来定位方法执行...
    99+
    2023-05-31
    jvm 方法调用 静态
  • java中静态方法与非静态方法的区别
    静态方法与静态成员变量一样,属于类本身,在类装载的时候被装载到内存中,不自动进行销毁,会一直存在内存中,直到JVM关闭。非静态方法又称实例化方法,属于实例对象,实例化之后才会分配内存,必须通过类的实例来引用,当实例对象被JVM回收之后,也跟...
    99+
    2018-06-09
    java基础 java 静态方法 非静态方法 区别
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作