Java 8 新特性之默认方法
1. 简介
默认方法就是接口可以有实现方法, 而且不需要实现类去实现其方法, 默认方法的实现只需要在方法名的前面加一个default关键字即可实现默认方法.
2. 默认方法语法
public interface Vehicle {default void print(){System.out.println("我是默认语法格式!");}
}
3. 为什么要有这个特性呢?
之前版本的接口是个双刃剑,好处是面向抽象而不是面向具体编程,缺陷是,当需要修改接口时候,需要修改全部实现该接口的类,目前的 java 8 之前的集合框架没有 foreach 方法,通常能想到的解决办法是在JDK里给相关的接口添加新的方法及实现。然而,对于已经发布的版本,是没法在给接口添加新方法的同时不影响已有的实现。所以引进的默认方法。他们的目的是为了解决接口的修改与现有的实现不兼容的问题。
4. 使用
在使用默认方法的时候, 可能会出现以下几种情况,
(1) 接口中有默认方法, 一个类如果实现了多个接口, 刚好实现的接口中有相同的默认方法, --多个相同的默认方法
解决方法有两种: 一种是定义自己的默认方法, 覆盖重写接口中的相同的默认方法; 另一种就是使用super指定调用接口中的方法.
(2) 静态默认方法, Java 8的另一个特性就是接口中可以声明并且可以提供实现的静态方法.
5. 测试
package com.defaultmethod;/*** 测试Java 8 新特性默认方法** @author C-jerry* @date 2020/5/25 20:04*/
//为了方便查看, 将接口是实现类写在一个Java文件中/*** Method1和Method2有着相同的默认方法sayOwn* 解决方案:* 1.使用super指定调用接口中的方法* 2.重写自己的默认方法,覆盖接口中相同的默认方法*/
interface Method1{default void sayOwn() {System.out.println("我是默认method1");}/*** 静态方法*/static void sqyOwn2(){System.out.println("用来测试接口中声明并实现静态方法");}
}
interface Method2{default void sayOwn() {System.out.println("我是默认method2");}
}/*** 实现了Method1和Method2* 测试用super指定默认方法和static方法*/
class Say1 implements Method1,Method2{public void sayOwn(){//指定调用Method1中的sayOwn()Method1.super.sayOwn();//测试静态方法Method1.sqyOwn2();}
}
/*** 覆盖接口中相同的方法* 注意: 类中default修饰重写的方法, 会编译报错-->类中default省略* 错误信息: 'sayOwn()' in 'com.defaultmethod.Say2' clashes with 'sayOwn()' in 'com.defaultmethod.Method1'; attempting to assign weaker access privileges ('package-private'); was 'public'*/
class Say2 implements Method1,Method2{//方法一
// @Override
// public void sayOwn() {// System.out.println("定义自己的sayOwn方法,覆盖接口中的方法, 方法一");
// }//方法二: 覆盖实现接口中的默认方法public void sayOwn(){System.out.println("定义自己的sayOwn方法,覆盖接口中的方法, 方法二");}
}/*** 测试接口实现两方法, 重写自己的默认方法*/
interface Method3 extends Method1, Method2 {default void sayOwn() {System.out.println("接口Method3继承Method1和Method2, 重写自己的默认方法");}
}class say3 implements Method3{}//测试类
public class TestDefaultMethod {public static void main(String[] args) {Method1 say1 = new Say1();say1.sayOwn();Method2 say2 = new Say2();say2.sayOwn();Method3 say3 = new say3();say3.sayOwn();/*结果:情况一我是默认method1用来测试接口中声明并实现静态方法定义自己的sayOwn方法,覆盖接口中的方法, 方法一接口Method3继承Method1和Method2, 重写自己的默认方法情况二我是默认method1用来测试接口中声明并实现静态方法定义自己的sayOwn方法,覆盖接口中的方法, 方法二接口Method3继承Method1和Method2, 重写自己的默认方法*/}}
Java 8 新特性之默认方法相关推荐
- 【java8新特性】——默认方法(五)
一.简介 默认方法是指接口的默认方法,它是java8的新特性之一.顾名思义,默认方法就是接口提供一个默认实现,且不强制实现类去覆写的方法.默认方法用default关键字来修饰. 默认方法可以解决的痛点 ...
- java8新特性_乐字节-Java8新特性-接口默认方法
总概 JAVA8 已经发布很久,而且毫无疑问,java8是自java5(2004年发布)之后的最重要的版本.其中包括语言.编译器.库.工具和JVM等诸多方面的新特性. Java8 新特性列表如下: 接 ...
- Java 8新特性探究(二)深入解析默认方法
转载自 Java 8新特性探究(二)深入解析默认方法 什么是默认方法,为什么要有默认方法 简单说,就是接口可以有实现方法,而且不需要实现类去实现其方法.只需在方法名前面加个default关键字即可. ...
- 【Java 8 新特性】Java Comparator.reversed | 倒序排序 - 默认方法
Java Comparator.reversed | 倒序排序 - 默认方法 在 Stream.sorted 中使用 在 List.sort 中使用 在 Collections.sort 中使用 参考 ...
- Java 8新特性——default方法(defender方法)介绍
转载自 Java 8新特性--default方法(defender方法)介绍 我们都知道在Java语言的接口中只能定义方法名,而不能包含方法的具体实现代码.接口中定义的方法必须在接口的非抽象子类中实现 ...
- 【Java 8 新特性】Java Stream 通过skip()方法跳过前N个子元素
[Java 8 新特性]Java Stream 通过skip方法跳过前N个子元素 1.skip() 示例 2.skip() vs limit() 参考文献 本页将介绍 Stream.skip方法示例. ...
- Java 8 新特性:扩展注解(类型注解和重复注解)
转载自 Java 8 新特性:扩展注解(类型注解和重复注解) (注:先回顾下JDK1.5版本出现的注解 ,然后再解释JDK 8的注解 更新内容.) 一.注解(JDK1.5) 1.注解(@): 注解就 ...
- Java 9 新特性概述
转载自 Java 9 新特性概述 Java 9 正式发布于 2017 年 9 月 21 日 .作为 Java8 之后 3 年半才发布的新版本,Java 9 带 来了很多重大的变化.其中最重要的改动是 ...
- Java 10新特性
Java 10新特性 Java 10是其23年历史中最快的java版本.Java因其缓慢的增长和发展而受到批评,但Java 10刚刚破坏了这一概念.Java 10是一个具有许多未来变化的版本,其范围和 ...
最新文章
- 静态方法static 的了解
- oracle数据库学习相关笔记-转换函数
- ORA-00031: session marked for kill 处理Oracle中杀不掉的锁
- JavaScript计算汉明距离(HammingDistance)
- Linux共享库路径配置
- oracle method_opt,统计量收集Method_Opt参数使用(下)
- python 关于字节串和字符串
- mysql索引选择_MySQL 索引选择原则
- 学生渐进片add如何给_渐进片的那些事「5」——验配之前的问诊
- paip. lbmall V3.1.1 乐彼多用户商城系统的安全漏洞总结
- ms sqlserver对象、所属用户、所属架构、登陆用户、同义词
- QTableView自定义拖拽行
- Ruby编程语言面试题库和答案(语法、代码)
- 企业快车道上的3个信号灯
- scikit-learn 的设计
- 蚂蚁金服、滴滴们掀起A/H上市潮,它们能打破折溢价的烦恼吗?
- 目标检测-twostage
- 数据结构——图基本概念
- SeleniumLibrary4.5.0 关键字详解(十)
- 自定义UITableViewCell实现ibooks类似的图书列表形式