前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java 8 新特性|接口默认方法

Java 8 新特性|接口默认方法

作者头像
Java小技巧
发布于 2022-05-23 04:52:04
发布于 2022-05-23 04:52:04
65300
代码可运行
举报
文章被收录于专栏:Java小技巧Java小技巧
运行总次数:0
代码可运行

Java 7 和之前的版本中,接口 interface 是不能包含具体的方法实现的。对于一个接口有多个实现的时候,我们通常的做法就是让所有的实现继承另一个基础类,然后在这个基础类中实现这个方法。

Java 8 中为接口提供了一个新的功能,允许某个接口方法有个默认实现。

1

默认方法

Java 8 为 接口 ( interface ) 中引入了 「 默认方法 」( default method ) 实现这个新的概念。

default 关键字,用于标识这个方法是可以有具体的实现。有了 default 关键字,我们就可以在所有集合都实现的接口 Collection<E> 中添加一个 forEach 方法啦。

这是一个非常重要的新功能,它的出现,Java 8 及以后的版本,添加新功能的速度明显加快了很多。

2

默认方法语法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.sjh.test.java8.service;

public interface Greeter {

    default void method(){
        System.out.println(" Hello ,我是二哥!");
    }
}

从语法中可以看到,一个接口默认方法和普通的接口方法声明有两个不同点:

1、 接口默认方法可以有具体实现

2、 接口默认方法需要使用 default 关键字修饰。

3

默认方法特征

1、 一个接口可以有任意数量的默认方法,也可以没有默认方法

2、 如果一个类实现的两个接口都有一个同名的默认方法,那么该类必须自己实现同样的方法,然后在实现内部可以调用相应接口的方法

4

代码范例

A

接口默认方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.sjh.test.java8.service;

public class Test1 {

    public static void main(String[] args)
    {
        Greeter gt = new Greeter(){};
        gt.greeter("二哥!");
    }

    interface Greeter {
        default public void greeter(String name)
        {
            System.out.println("Hello ," + name );
        }
    }
}

运行结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/...com.sjh.test.java8.service.Test1
Hello ,二哥!

Process finished with exit code 0

B

一个接口可以有多个默认方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.sjh.test.java8.service;

public class Test2 {
    public static void main(String[] args)
    {
        Greeter gt = new Greeter(){};
        gt.greeter("二哥!");
        gt.greeterEn("JayLa!");
    }

    interface Greeter {
        default public void greeter(String name)
        {
            System.out.println("你好," + name );
        }

        default public void greeterEn(String name)
        {
            System.out.println("Hello," + name );
        }
    }
}

运行结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/...com.sjh.test.java8.service.Test2
你好,二哥!
Hello,JayLa!

Process finished with exit code 0

C

一个类实现了多个具有同名的默认方法接口

如果一个类实现了两个或两个以上的接口,而这些接口有两个或两个以上实现了相同的方法名的默认方法,最简单的方法就是类自己实现一个相同的方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.sjh.test.java8.service;

public class Test3 {

    public static void main(String[] args)
    {
        Test3 tester = new Test3();
        tester.run();
    }

    public void run()
    {
        Greeter gt = new Hello();
        gt.greeter("二哥!");
    }

    class Hello implements Greeter,GreeterEn {
        public void greeter(String name)
        {
            System.out.println("1、你好," + name );
        }
    }


    interface Greeter {
        default public void greeter(String name)
        {
            System.out.println("2、你好," + name );
        }
    }

    interface GreeterEn {

        default public void greeter(String name)
        {
            System.out.println("3、Hello," + name );
        }
    }
}

运行结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/...com.sjh.test.java8.service.Test3
1、你好,二哥!

Process finished with exit code 0

还可以调用相关接口的默认方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.sjh.test.java8.service;

public class Test4 {
    public static void main(String[] args)
    {
        Test4 tester = new Test4();
        tester.run();
    }

    public void run()
    {
        Greeter gt = new Hello();
        gt.greeter("二哥!");
    }

    class Hello implements Greeter,GreeterEn {
        public void greeter(String name)
        {
            Greeter.super.greeter(name);
        }
    }


    interface Greeter {
        default public void greeter(String name)
        {
            System.out.println("1、你好," + name );
        }
    }

    interface GreeterEn {

        default public void greeter(String name)
        {
            System.out.println("2、Hello," + name );
        }
    }
}

运行结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/...com.sjh.test.java8.service.Test4
1、你好,二哥!

Process finished with exit code 0

end

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java小技巧 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
ReactNative_react-native-vector-icons的简单使用,图片,按钮,标签视图,导航条
ICONS是可以直接使用图片名, 就能加载图片的三方,使用很方便, 你不需要在工程文件夹里塞各种图片, 节省很多空间,下面就来看看怎么使用吧!
mikimo
2022/07/20
1.3K0
ReactNative_react-native-vector-icons的简单使用,图片,按钮,标签视图,导航条
React-native-scrollable-tab-view详解
前言:他方山上有佳石,可以用来琢玉器。只有解决了一个红屏,才有机会遇见另一个红屏。只有解决了一个困难,才有机会遇到其他的困难。O(∩_∩)O~生命不息,奋斗不止。 React Native中有许多第三方用于封装tabBar的库,当然也有官方提供的。React-native-scrollable-tab-view是一款非常实用的第三方库。放于界面之上可以实现一个界面中子界面的切换效果,置于界面之下可实现功能模块间的切换,通常用于封装自定义的tabBar。 安装 在终端输入命令 npm i react-na
谦谦君子修罗刀
2018/05/02
4.4K0
React-native-scrollable-tab-view详解
React Native跨平台开发实战:从零到一
最近在学习React Native跨平台开发,从零开始如何开发第一个基础应用并打包发布:
天涯学馆
2024/06/02
4880
ReactNative-底部TabBar react-native-tab-navigator
首先需要安装 react-native-tab-navigator npm install react-native-tab-navigator –save 导入组件 import TabNavigator from 'react-native-tab-navigator' 详细代码如下: import React, { Component } from 'react'; import { AppRegistry, ScrollView, StyleSheet, TouchableOpaci
czjwarrior
2018/05/28
8270
React Native学习笔记(三)—— 样式、布局与核心组件
React Native 有一个内置的命令行界面,你可以用它来生成一个新项目。您可以使用 Node.js 附带的 访问它,而无需全局安装任何内容。让我们创建一个名为“AwesomeProject”的新 React Native 项目:npx
张果
2023/04/12
14.6K0
React Native学习笔记(三)—— 样式、布局与核心组件
React-Native组件之 Navigator和NavigatorIOS
对于app而言,一款应用往往涉及到很多的页面,而页面之间的跳转Android和iOS实现也各不相同。在iOS上,系统为我们提供了UINavigationController控件用来专门控制页面的跳转,iOS的实现思路很清晰,为按钮添加action事件,点击之后跳转到指定的页面即可。例如: //定义一个Button,点击后跳转到另一个页面 UIButton * button=[UIButton buttonWithType:UIButtonTypeSystem]; button.frame=C
xiangzhihong
2018/02/06
4.6K0
React-Native组件之 Navigator和NavigatorIOS
React Native导航器之react-navigation使用
在上一节Navigation组件,我们使用系统提供的导航组件做了一个跳转的例子,不过其实战能力不强,这里推荐一个超牛逼的第三方库:react-navigation。在讲react-navigation之前,我们先看一下常用的导航组件。 导航控件 常见的导航主要分为三种: 1.StackNavigator :类似于普通的Navigator,屏幕上方导航栏 2.TabNavigator:obviously, 相当于iOS里面的TabBarController,屏幕下方标签栏 3.DrawerNavi
xiangzhihong
2018/02/06
12.8K0
React Native导航器之react-navigation使用
使用react-native-tab-navigator切换页面
切换页面是app最基本功能。这个功能需要用Navigation组件实现。 RN发展太快了(v49),之前自带的Navigation组件被弃用了,如果只针对ios,还可以用NavigatorIOS 社区中也有几个不错的 https://github.com/react-community/react-navigation https://github.com/wix/react-native-navigation https://github.com/happypancake/react-native-tab-navigator 以react-native-tab-navigator为例,实现下面的tab切换效果很容易:
mafeifan
2018/09/10
2.8K0
使用react-native-tab-navigator切换页面
React Native之prop-types进行属性确认
React Native已经升级到0.51.0了,版本升级很快,但是对老项目也会有一些问题,常见的就是属性找不到的问题。例如: 主要原因是随着React Native的升级,系统废弃了很多
xiangzhihong
2018/02/06
1.5K0
React Native之prop-types进行属性确认
7. 偷用Swiper简改
看这段代码应该就很清楚了,如果是android系统就渲染Pager如果是ios就使用横向的ScrollView,修改后的app首页如下:
MasterVin
2018/08/30
2K0
7. 偷用Swiper简改
React Native 使用react-native-image-picker库实现图片上传功能
react-native-image-picker作为一个集成相机和相册的功能的第三方库,因为其使用相对简单受到前端开发人员的喜爱。 react-native-image-picker使用 1, 首先,安装下该插件。 npm install react-native-image-picker@latest --save 2, 针对Android和iOS平台分别进行配置 ## android 平台配置 1,在android/settings.gradle文件中添加如下代码: include ':react-n
xiangzhihong
2018/02/06
5.6K0
React Native 使用react-native-image-picker库实现图片上传功能
react-native导航组件
创建 src/navigation.js 文件,在其中添加一个导航器组件,以及两个屏幕组件 HomeScreen 和 ProfileScreen。同时在这两个屏幕组件中添加一个按钮,用于导航到另一个屏幕组件。
kongxx
2024/06/17
1620
React Native 表格组件
npm install--save react-native-data-table
forrest23
2018/08/03
1.9K0
React Native 表格组件
从0到1打造一款react-native App(三)Camera
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/j_bleach/article/details/80723293
j_bleach
2019/07/02
1.7K0
从0到1打造一款react-native App(三)Camera
React Native(二):react-navigation
react-navigation是FaceBook推荐使用的一个库,用于导航效果,官方文档
Helloted
2022/06/07
2.2K0
React Native(二):react-navigation
React Native组件之Button
不管在Android还是ios开发中,系统都有Button组件,而在早期的React Native中,系统是不提供Button组件的,一般会使用一个叫做react-native-button的库。 Button组件 Button组件其实就是 Touchable(TouchableNativeFeedback、TouchableOpacity)和Text封装。核心源码如下: render() { const { accessibilityLabel, color,
xiangzhihong
2018/02/06
1.4K0
React Native组件之Button
MobX 在 React Native开发中的应用
MobX 是一款精准的状态管理工具库,如果你在 React 和 React Native 应用中使用过 Flux、Alt、Redux 和 Reflux,那毫不犹豫地说,MobX 的简单性将成为你状态管
xiangzhihong
2018/01/26
12.7K0
react-native布局与组件
一款好的App离不开漂亮的布局,RN中的布局方式采⽤的是FlexBox(弹性布局) 。
一粒小麦
2019/09/17
5.4K0
react-native布局与组件
React Native之react-native-scrollable-tab-view详解
在React Native开发中,官方为我们提供的Tab控制器有两种:TabBarIOS和ViewPagerAndroid。TabBarIOS,仅适用于IOS平台 ViewPagerAndroid,仅适用于Android平台(严格来讲并不算,因为我们还需要自己实现Tab)。在项目开发中,我们优先选择一些开源兼容性比较好的第三方库,例如,react-navigation,以及本文即将说到的react-native-scrollable-tab-view(官方地址)。react-native-scrolla
xiangzhihong
2018/02/06
6.6K0
React Native之react-native-scrollable-tab-view详解
React Native之常用第三方库
前言 React Native出来一年多了,受到各大开发人员的喜爱,但是由于只是专注于View层的开发,因此在很多深层次上还需要结合原生app做一定的兼容,还有就是现在好多控件,如Android中已是系统的控件的sidemenu、checkbox、gridview等,这些在react native中 系统是没有给我们提供的,这时候就借助了第三方开源的力量。 那么我们今天说说在React Native项目开发中常见的一些第三方库。 常见的第三方库 组件篇 CheckBox(多选按钮) react-nati
xiangzhihong
2018/02/05
9K0
React Native之常用第三方库
相关推荐
ReactNative_react-native-vector-icons的简单使用,图片,按钮,标签视图,导航条
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档