Java 8和Java 9对接口的增强

news/2024/7/7 20:38:39

Java 8和Java 9对接口的增强

需要说明的是,前面介绍的都是Java 8之前的接口概念,Java 8和Java 9对接口做了一些增强。在Java 8之前,接口中的方法都是抽象方法,都没有实现体,Java 8允许在接口中定义两类新方法:静态方法和默认方法,

它们有实现体,比如:

public interface IDemo {

void hello();

public static void test() {

System.out.println("hello");

}

default void hi() {

System.out.println("hi");

}

}

test()就是一个静态方法,可以通过IDemo.test()调用。在接口不能定义静态方法之前,相关的静态方法往往定义在单独的类中,比如,Java API中,Collection接口有一个对应的单独的类Collections,在Java 8中,就可以直接写在接口中了,比如Comparator接口就定义了多个静态方法。

hi()是一个默认方法,用关键字default表示。默认方法与抽象方法都是接口的方法,不同在于,默认方法有默认的实现,实现类可以改变它的实现,也可以不改变。引入默认方法主要是函数式数据处理的需求,是为了便于给接口增加功能。

关于函数式数据处理,会在第26章介绍。

在没有默认方法之前,Java是很难给接口增加功能的,比如List接口(第9章介绍),因为有太多非Java JDK控制的代码实现了该接口,如果给接口增加一个方法,则那些接口的实现就无法在新版Java上运行,必须改写代码,实现新的方法,这显然是无法接受的。函数式数据处理需要给一些接口增加一些新的方法,所以就有了默认方法的概念,接口增加了新方法,而接口现有的实现类也不需要必须实现。看一些例子,List接口增加了sort方法,其定义为:

default void sort(Comparator<? super E> c) {

Object[] a = this.toArray();

Arrays.sort(a, (Comparator) c);

ListIterator<E> i = this.listIterator();

for(Object e : a) {

i.next();

i.set((E) e);

}

}

Collection接口增加了stream方法,其定义为:

default Stream<E> stream() {

return StreamSupport.stream(spliterator(), false);

}在Java 8中,静态方法和默认方法都必须是public的,Java 9去除了这个限制,它们都可以是private的,引入private方法主要是为了方便多个静态或默认方法复用代码,比如:

public interface IDemoPrivate {

private void common() {

System.out.println("common");

}

default void actionA() {

common();

}

default void actionB() {

common();

}

}

这里,actionA和actionB两个默认方法共享了相同的common()方法的代码。

https://www.bilibili.com/video/BV12x4y1j7rq/?spm_id_from=333.999.0.0


http://lihuaxi.xjx100.cn/news/823494.html

相关文章

Java面向对象:封装特性的学习

本篇文章接受了Java面向对象的封装特性,什么是封装,封装的体现,Java四种访问权限修饰符的介绍 介绍了Java中的包,什么是包,如何导入包中的类,包的访问权限以及认识Java内常见的包 Java面向对象封装特性一.认识面向对象特性: 封装1.什么是封装?2.Java内封装的体现3.Java四种访问…

笔记:Space-time Neural Irradiance Fields for Free-Viewpoint Video

论文标题&#xff1a;自由视角的时空神经辐射&#xff08;发光&#xff09;场 创新点 使用RGBD单目视频&#xff08;2.5D&#xff09;表示时空。引入对场景深度的监督解决运动模糊问题。 &#xff08;本文仅介绍对NeRF的改进部分&#xff09; 深度重建损失 问题&#xff1…

春天又来了,做好自己的一年之计

春天来了&#xff0c;温暖的阳光普照大地。百花争艳&#xff0c;正如一幅五彩斑斓的画卷&#xff0c;一遍又一遍将景色熠熠生辉。新鲜的空气中充满了花草树木的香味&#xff0c;令人感到神清气爽。春意盎然&#xff0c;鲜花释放出浓郁的芬芳&#xff0c;伴随着小鸟鸣叫令人心旷…

如何制作启动U盘安装系统?

用户问题&#xff1a;新手自己用U盘怎么装系统 很多用户对电脑莫名有种小心翼翼的感觉&#xff0c;总担心整崩溃。其实电脑就跟手机差不多&#xff0c;常见的操作不会影响电脑正常运行&#xff0c;而重要的操作几乎都有操作提示或说明&#xff0c;对于用户使用来说它其实没有那…

SpringCloud系列 Nacos配置管理

在Nacos中添加配置信息&#xff1a; 工程引入&#xff1a; nacos配置管理依赖 <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> bootstrap.yml&a…

SV中的关键词使用virtual,cast

virtual SV不允许一个子类句柄指向父类对象,但是可以让一个父类句柄指向子类对象。由于父类句柄只能访问父类的成员变量和方法,不利于验证环境的复用;所以为了让继承了同一父类的子类能将一个同名方法扩展为不同功能的方法,利用类的多态,将父类中的方法声明为virtual,而指…

算法刷题 Day 31 | ● 455.分发饼干 ● 376. 摆动序列 ● 53. 最大子序和

贪心算法其实就是没有什么规律可言,所以大家了解贪心算法 就了解它没有规律的本质就够了。 不用花心思去研究其规律, 没有思路就立刻看题解。 基本贪心的题目 有两个极端,要不就是特简单,要不就是死活想不出来。 学完贪心之后再去看动态规划,就会了解贪心和动规的区别。…

朴素贝叶斯代码实现python

P(B)称为"先验概率"&#xff0c;即在A事件发生之前&#xff0c;对B事件概率的一个判断。P(B|A)称为"后验概率"&#xff0c;即在A事件发生之后&#xff0c;对B事件概率的重新评估。P(A|B)/P(A)称为"可能性函数"&#xff0c;这是一个调整因子&…