Java基础巩固——JDK 8、9新增接口的特性(接口中定义非抽象方法、静态方法和私有方法)

news2024/9/22 21:32:51

#Java学了这么久,项目也做了?基础知识还不巩固?快来关注我的这篇系列博客——Java基础复习巩固吧#

目录

引言

一、JDK8新特性:允许在接口中定义非抽象方法和静态方法。

注意事项

 二、JDK9新特性:允许在接口中定义private私有方法。


引言

        Java中的接口起到了规范项目业务逻辑的作用,在JDK8以前,接口中的方法默认是抽象的,即只有方法的声明,没有方法的实现。

  • 从 JDK 8 开始,接口中可以定义非抽象方法和静态方法。
  • 从 JDK 9 开始,接口中可以定义私有方法和静态私有方法。

那么,Java设计师们为何要对借口进行这一系列的改进呢?下面请让我来为大家解答。

一、JDK8新特性:允许在接口中定义非抽象方法和静态方法。

新增特性:

  • 允许在接口中定义非抽象方法,但需要使用default关键字修饰,称为接口的默认方法;
  • 允许在借口中定义非抽象的静态方法

目的:解决接口升级的问题;

        例如,当团队的第一版项目成功上线,一段时间要对项目进行全面升级,要求丰富某一个接口的功能,新增8个方法;假如该项目中有100个类都实现了该接口,那么借口一旦改动,这100个类的都要重写新增方法,牵一发而动全身 。

        为了解决这个普遍问题,JDK8中允许接口中定义非抽象方法(通常称默认方法),实现该接口的类不用对默认方法进行重写而是可以直接继承,这极大减小了项目中升级接口的代价。

接口中默认方法的定义格式:

○格式: public  default  返回值类型  方法名(参数列表){}

○范例: public  default  void  show ( ) {....}

代码示例:

    //定义一个接口
    interface interA{
        void func01(); //抽象方法func1
        default void method(){
            System.out.println("我是接口中的默认方法method...");
        }
    }

    //定义一个类A,实现接口interA
    class A implements interA{
        @Override
        public void func01() {
            System.out.println("我是方法func01,我被重写了...");
        }
    }

    //定义一个类B,实现接口interA
    class B implements interA{
        @Override
        public void func01() {
            System.out.println("我是方法func01,我被重写了...");
        }
    }
public class Test {
    public static void main(String[] args) {
        A a = new A();
        a.method();
    }
}

 输出:我是接口中的默认方法method...

        上述代码中,接口interA中有一个抽象方法func01()和一个默认方法method(),实现该接口的类A和类B必须重写接口中的func01()而无需重写默认方法method();而是直接继承了接口中的默认方法;类A的示例a可以直接调用默认方法method()

        此时的你可能会提出一个疑问:如果一个类实现了多个接口,而这些接口中存在相同名字的默认方法时,那么这个类到底继承的是那个接口中(方法名相同)的默认方法呢?

答案就是,编译器会先报错,提示你必须重写这个多个接口中(方法名相同)的默认方法。

   //定义两个接口interA和interB
    interface interA{
        void funcA(); //抽象方法func1
        default void method(){
            System.out.println("我是接口A中的默认方法method...");
        }
    }
    interface interB{
        void funcB();
        default void method(){
            System.out.println("我是接口B中的默认方法method...");
        }
    }
    
    //定义一个类A,实现接口interA和interB
    class A implements interA,interB{ //会报错
        @Override
        public void funcA() {
            System.out.println("我是方法funcA,我被重写了...");
        }

        @Override
        public void funcB() {
            System.out.println("我是方法funB,我被重写了...");
        }
    }

 此时类A上会报错,如下图:

test.A inherits unrelated defaults for method() from types test.interA and test.interB(类A从类型test.interA和test.interB继承了method()的不相关默认值)

重写method()方法就好了:

        那么既然JDK8都允许了接口中可以定义非抽象方法,在开放一点也无妨,随后静态方法也允许在接口中存在。且只能通过接口名来调用

代码格式如下:

    //定义一个接口inter
    interface inter {
        //在该接口中定义一个静态方法func()
        public static void func(){
            System.out.println("我是接口中的静态方法func");
        }
    }

 用借口名来调用接口中的静态方法:

public class Test {
    public static void main(String[] args) {
        inter.func();
    }
}

输出:我是接口中的静态方法func

注意事项: 

1.接口中的默认方法:

  • 接口中的所有方法默认都是公有的,因此public可以省略,但default不能省略。

  • 接口的实现类允许重写接口中的默认方法,重写时要去掉default关键字。

  • 如果某个类实现了多个接口,且这多个接口中存在相同的默认方法,则实现类必须重写这个默认方法

 2.接口中的静态方法:

  • 关键字public可以省略,但static不能省略。

  • 接口中的静态方法,只允许通过接口名进行调用,不允许该接口实现类的对象调用

 二、JDK9新特性:允许在接口中定义private私有方法。

初学者小伙伴你是否有疑问?接口中的私有方法,实现类无法继承,也无法使用,有啥意义啊?

下面请看一个例子:

    //定义一个接口inter
    interface inter {
        //在该接口有多个默认方法,且都有相同的代码部分
        default void start(){
            System.out.println("执行start方法....");
            System.out.println("请求资源");
            System.out.println("更新日志");
            System.out.println("保存日志");
        }
        default void login(){
            System.out.println("执行login方法....");
            System.out.println("请求资源");
            System.out.println("更新日志");
            System.out.println("保存日志");
        }
        default void end(){
            System.out.println("执行end方法....");
            System.out.println("请求资源");
            System.out.println("更新日志");
            System.out.println("保存日志");
        }
    }

        由于接口中可以定义非抽象方法了,那么就有可能有重复的代码逻辑,上述代码有大量的重复内容,若通过编写一个默认方法来封装并代替这些重复代码,那么这个多写的默认方法就会被接口的实现类继承(一个无实际业务逻辑的方法不应当被继承),当有了私有方法后,就可以借助私有方法:

    interface inter {
        //在该接口有多个默认方法
        default void start(){
            System.out.println("执行start方法....");
            log();
        }
        default void login(){
            System.out.println("执行login方法....");
            log();
        }
        default void end(){
            System.out.println("执行end方法....");
            log();
        }

        private void log(){
            System.out.println("请求资源");
            System.out.println("更新日志");
            System.out.println("保存日志");
        }
    }

        此时借用私有方法来封装这些重复的代码逻辑,来减少代码量;确保这些重复的代码逻辑不被实现类继承,并且实现代码的复用。

作用:提升代复用性,减少冗余代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1950713.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【推研小灶】复旦与南大之间:一次独特的计算机保研之旅

写在前面 上午10点填完志愿等待复试通知,利用这段时间记录一下我简短的夏令营和预推免。今年变为线下之后,部分学校的入营情况、考核方式有明显变化。加上CS方向保研名额总体变多,形势有点小乱,甚至填报系统都在9.29中秋节当天&a…

AMQP-核心概念-3

本文参考以下链接摘录翻译: https://www.rabbitmq.com/tutorials/amqp-concepts 队列(Queues) AMQP 0-9-1模型中的队列和其他消息任务队列系统中的队列非常相似:它们用于存储被应用消费的消息。队列和交换机有一些相同的属性&…

2024.7.28周报

目录 摘要 ABSTRACT 一、文献阅读 一、题目 二、摘要 三、创新点 四、文献解读 一、Introduction 二、Saint-Venant方程 三、应用于水道建模的PINN 四、真实场景 五、结论 摘要 本周阅读了一篇题目为Physics-Informed Neural Networks for Modeling Water Flows …

免费【2024】springboot 毕业生学历证明系统

博主介绍:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围:SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…

vite5+vue3开发阅读APP实战笔记20240725

目前界面长成这样: 配置别名 修改vite.config.js import {defineConfig} from vite import vue from vitejs/plugin-vue import path from "path"// https://vitejs.dev/config/ export default defineConfig({server: {open: true,port: 8088,},plug…

Can we Deploy Web Application in Azure OpenAI of Production Level

题意:我们可以在Azure OpenAI中部署生产级别的Web应用程序吗 问题背景: I have created azure ai search service and used Text split skillset and made index. I also deployed a web Application but have a question that If I want to create to …

嵌入式Linux学习: 设备树实验

设备树(DeviceTree)是一种硬件描述机制,用于在嵌入式系统和操作系统中描述硬件设备的特性、连接关系和配置信息。它提供了一种与平台无关的方式来描述硬件,使得内核与硬件之间的耦合度降低,提高了系统的可移植性和可维…

实战解读:Llama Guard 3 Prompt Guard

前序研究:实战解读:Llama 3 安全性对抗分析 近日,腾讯朱雀实验室又针对 Llama 3.1 安全性做了进一步解读。 2024年7月23日晚,随着Llama3.1的发布,Meta正式提出了“Llama系统”的概念,通过系统级的安全组件对…

黄景仁,笔墨间的一抹清寒

黄景仁,字汉镛,一字仲则,号鹿菲子,生于乾隆十四年(公元1749年),卒于乾隆四十八年(公元1783年),享年仅35岁。他是宋代大诗人黄庭坚的后裔,出生于常…

Feign-微服务通信(Feign远程调⽤ Feign简介 基本使⽤ ⾃定义配置 Feign使⽤优化)

目录 一、Feign远程调⽤ 二、Feign简介 三、基本使⽤ 1. 加⼊Fegin的依赖 2. 在主类上添加Fegin的注解 3. 创建⼀个service, 并使⽤Fegin实现微服务调⽤ 4. 修改controller代码,并启动验证 5. 重启order微服务,查看效果 四、⾃定义配置…

java.lang.ThreadLocal

ThreadLocal万字总结https://blog.csdn.net/sinat_33921105/article/details/103295070 key的唯一性 一个线程中的多个ThreadLocal变量如何存储、如何保证唯一性&#xff1f; 每一个 ThreadLocal<T> tl new ThreadLocal<>(); 创建出来都有一个不变且唯一的thre…

Codeforces Round 949 (Div. 2) B. Turtle and an Infinite Sequence (找规律,位运算)

不知道为什么会有找规律这种nt题型。 首先每一秒都会发生 a i a i − 1 ∣ a i ∣ a i 1 a_i a_{i-1} | a_i | a_{i1} ai​ai−1​∣ai​∣ai1​&#xff0c;如果我们多写几步&#xff1a; a i 2 a i − 1 1 ∣ a i 1 ∣ a i 1 1 a i − 2 ∣ a i − 1 ∣ a i ∣ a i −…

力扣高频SQL 50 题(基础版)第三题

文章目录 力扣高频SQL 50 题&#xff08;基础版&#xff09;第三题1148.文章浏览题目说明思路分析实现过程准备数据实现方式结果截图 力扣高频SQL 50 题&#xff08;基础版&#xff09;第三题 1148.文章浏览 题目说明 Views 表&#xff1a; ---------------------- | Colu…

用 python 求拥塞控制模型欧拉数值解

昨天使用 scipy 的 odeint 模拟了 E_best 的微分方程组模型(参见 用 python scipy 库模拟拥塞控制模型)&#xff0c;但我觉得那个模型中处理 z 时不够优雅&#xff0c;只是一个负反馈&#xff0c;并未体现 “排队时延与 buffer 占用率成比例增长” 的事实&#xff0c;所以今天我…

基于NE555制作雾化加湿器

基于NE555制作雾化加湿器 &#x1f33c;实物制作图&#xff1a;&#xff08;只焊接了2路&#xff0c;进行功能验证&#xff09; &#x1f4fa;演示效果&#xff1a; &#x1f341;原理图&#xff1a; &#x1f389;其他方案&#xff1a;基于专用加湿器芯片&#xff1a;富…

noVNC使用与介绍

noVNC使用与介绍报告 1. 概述 VNC&#xff08;Virtual Network Console&#xff0c;虚拟网络控制台&#xff09;是一种流行的远程桌面访问协议&#xff0c;它允许用户通过网络连接到远程计算机的图形界面。VNC协议的实现通常包括两个主要组件&#xff1a;服务器端&#xff08…

充满惊喜与欢乐的老友

在这个充满惊喜与欢笑的娱乐圈里&#xff0c;每一个不经意的可能成为网友热议的焦点&#xff0c;而《快乐老友记》的花絮&#xff0c;无疑为这个多彩的世界又添上了一抹亮丽的色彩。当“王栎鑫被路人认成张艺兴”这一话题如春风般拂过网络&#xff0c;不仅让两位才华横溢的艺人…

硬核科普:什么是网络准入控制系统|网络准入控制系统四大品牌介绍

网络准入控制系统&#xff08;Network Access Control, NAC&#xff09;是一种用于确保只有授权设备和用户才能接入网络的安全技术。 本文将介绍几种常用的网络准入控制系统&#xff0c;帮助您更好地了解如何选择适合您企业的NAC系统。 网络准入控制的重要性和作用 网络准入控…

Jenkins集成JDK、git、gitee、maven逐步实现自动拉取,自动部署,自动启动

1. jenkins集成JDK 成功登录Jenkins后&#xff0c;选择Manage Jenkins&#xff0c;选择Tools 集成JDK 2. jenkins集成git 因为Jenkins自动从git远程仓库拉取代码 首先要在Jenkins所在的linux服务器上安装git yum install -y git然后&#xff0c;实行集成JDK的第一步 配置g…

ElMessage自动引入,样式缺失和ts esline 报错问题解决

一. 环境 "unplugin-auto-import": "^0.17.6", "vue": "^3.3.8", "vite": "^5.0.0", "typescript": "^5.2.2",二. ElMessage样式缺失问题. 以下有两种解决方法 方法一: 配置了自动引用后…