Java8中接口的新特性使用指南
作者:南风Candy 发布时间:2023-01-21 15:19:26
前言
在Java8中接口中不再只有抽象方法,还可以有静态方法以及默认方法,此时的接口更像是一个类。我们一起来看看如何使用吧~
Java8中,可以为接口添加静态方法和默认方法。
静态方法:使用static关键字修饰。可以通过接口直接调用静态方法,并执行其方法体
默认方法:使用default关键字修饰。可以通过类来调用
直接看代码吧
package com.nanfeng.demo.interfacepractice.java8;
/**
* java8中的新特性
* 在接口中默认方法的权限是public,所以public也可以省略
*/
public interface CompareA {
// 接口中可以定义抽象方法
public static void method1() {
System.out.println("Java8中接口中可以定义静态方法,通过接口来调用--1");
}
// 默认方法
public default void method2() {
System.out.println("Java8中接口中可以定义默认方法--2");
}
public default void method3() {
System.out.println("Java8中接口中可以定义默认方法--3");
}
}
编写测试类ComepareTest
package com.nanfeng.demo.interfacepractice.java8;
public class CompareATest {
public static void main(String[] args) {
// 创建实现类对象
CompareAClass c = new CompareAClass();
/**
* 知识点一:接口中的静态方法 只能通过接口来调用
* Static method may be invoked on containing interface class only
* 静态方法只能在包含接口类时调用 */
// c.method1();
// 使用接口调用method1()方法,此时的接口有点像工具类了
CompareA.method1();
/**
* 知识点二:
* 默认方法,可以通过创建实现类的对象来调用接口中的默认方法
* 或者也可以对接口中的默认方法进行重写
*/
c.method2();
}
}
class CompareAClass implements CompareA {
/**
* 在实现类中对接口中的默认方法进行重写时
* 注意:不可以省略public权限修饰,否则会报错
* 执行时,依然会调用我们重写后的方法,符合继承
*
*
*/
@Override
public void method2() {
System.out.println("Java8中实现类可以对接口中的默认方法进行重写,注意声明方法的权限修饰符为public,且public不可省略");
}
}
运行结果:
Java8中接口中可以定义静态方法,通过接口来调用
Java8中实现类可以对接口中的默认方法进行重写,注意声明方法的权限修饰符为public,且public不可省略--2
第一种情况,一个类实现了接口的同时又继承了一个父类
1、创建实现类的父类
package com.nanfeng.demo.interfacepractice.java8;
/**
* 实现类的父类
*/
public class SuperClass {
// 定义与接口中同名的方法
public void method3(){
System.out.println("实现类的父类中,出现和接口中同名同参数的方法--SuperClass");
}
}
2、让子类实现接口的同时继承父类
package com.nanfeng.demo.interfacepractice.java8;
public class CompareATest {
public static void main(String[] args) {
// 创建实现类对象
CompareAClass c = new CompareAClass();
/**
* 知识点一:接口中的静态方法 只能通过接口来调用
* Static method may be invoked on containing interface class only
* 静态方法只能在包含接口类时调用 */
// c.method1();
// 使用接口调用method1()方法,此时的接口有点像工具类了
CompareA.method1();
/**
* 知识点二:
* 默认方法,可以通过创建实现类的对象来调用接口中的默认方法
* 或者也可以对接口中的默认方法进行重写
*/
c.method2();
/**
* 知识点三:
* 父类中的方法和接口中的方法同名时应该怎么处理?
* 如果子类(或实现类)继承的父类和实现的接口中声明了同名同参的方法
* 那么在子类没有重写此方法时,默认的调用的是父类中同名同参的方法。
* -->类优先原则
*/
c.method3();
}
}
class ComepareAClass extends SuperClass implements CompareA {
/**
* 在实现类中对接口中的默认方法进行重写时
* 注意:不可以省略public权限修饰,否则会报错
* 执行时,依然会调用我们重写后的方法,符合继承
*/
@Override
public void method2() {
System.out.println("Java8中实现类可以对接口中的默认方法进行重写,注意声明方法的权限修饰符为public,且public不可省略");
}
}
运行查看结果:
Java8中接口中可以定义静态方法,通过接口来调用--1
Java8中实现类可以对接口中的默认方法进行重写,注意声明方法的权限修饰符为public,且public不可省略--2
实现类的父类中,出现和接口中同名的方法--SuperClass
情况二
实现类在没有继承父类的前提下,对多个接口进行实现,应该如何处理
1、创建CompareB接口,创建和CompareA接口中通同参的默认方法
注意:如果一个类同时继承多个接口,接口中出现同名同参的默认方法时,会出现接口冲突。此时,实现类必须重写此方法
/**
* Java接口中支持接口的多继承
* 情况一:
* class ComepareAClass extends SuperClass implements CompareA
* CompareA接口和SuperClass父类出现同名同参的方法时,默认会调用父类中的方法,体现了类优先原则
* 情况二:
* class ComepareAClass implements CompareA, CompareB
* 在没有继承父类的前提下,一个类对多个接口继承的前提下,两个接口中定义了同名同参的默认方法,会如何执行?
* 知识点四:
* 如果一个实现类实现了多个接口,而这多个接口中定义了同名同参的默认方法,那么在实现类没有重写此方法的情况下,报错
* -->会出现借口冲突
* 这就必须我们在实现类中重写此方法
*
*/
class CompareAClass implements CompareA, CompareB {
/**
* 在实现类中对接口中的默认方法进行重写时
* 注意:不可以省略public权限修饰,否则会报错
* 执行时,依然会调用我们重写后的方法,符合继承
*/
@Override
public void method2() {
System.out.println("Java8中实现类可以对接口中的默认方法进行重写,注意声明方法的权限修饰符为public,且public不可省略--2");
}
// 解决接口冲突,必须对接口中的方法进行重写
@Override
public void method3() {
System.out.println("ComepareAClass实现类对多个接口中的同名方法进行重写,重写后执行的就是实现类中的方法--method3()");
}
}
运行结果:
Java8中接口中可以定义静态方法,通过接口来调用--1
Java8中实现类可以对接口中的默认方法进行重写,注意声明方法的权限修饰符为public,且public不可省略--2
ComepareAClass实现类对多个接口中的同名方法进行重写,重写后执行的就是实现类中的方法--method3()
情况三
在子类(或实现类)中自己定义的方法中,调用接口和父类中没有被重写的方法
/**
* Java接口中支持接口的多继承
* 情况一:
* class ComepareAClass extends SuperClass implements CompareA
* CompareA接口和SuperClass父类出现同名同参的方法时,默认会调用父类中的方法,体现了类优先原则
* 情况二:
* class ComepareAClass implements CompareA, CompareB
* 在没有继承父类的前提下,一个类对多个接口继承的前提下,两个接口中定义了同名同参的默认方法,会如何执行?
* 知识点四:
* 如果一个实现类实现了多个接口,而这多个接口中定义了同名同参的默认方法,那么在实现类没有重写此方法的情况下,报错
* -->会出现借口冲突
* 这就必须我们在实现类中重写此方法
* 情况三:
* class CompareAClass extends SuperClass implements CompareA, CompareB
* 一个子类(或实现类)继承父类的同时实现多个接口
* 在子类(或实现类)中自己定义的方法中,调用接口和父类中没有被重写的方法
* */
class CompareAClass extends SuperClass implements CompareA, CompareB {
/**
* 在实现类中对接口中的默认方法进行重写时
* 注意:不可以省略public权限修饰,否则会报错
* 执行时,依然会调用我们重写后的方法,符合继承
*/
@Override
public void method2() {
System.out.println("Java8中实现类可以对接口中的默认方法进行重写,注意声明方法的权限修饰符为public,且public不可省略--2");
}
// 解决接口冲突,必须对接口中的方法进行重写
@Override
public void method3() {
System.out.println("ComepareAClass实现类对多个接口中的同名方法进行重写,重写后执行的就是实现类中的方法--method3()");
}
/**
* 知识点五:如何在子类(或实现类)的方法中调用父类(或者接口中)没有被重写的方法
*/
public void myMethod(){
// 调用自己重写的method3()方法
this.method3();
// 调用父类中声明的method3()方法
super.method3();
// 调接口中的默认方法(注意:是非静态方法,所以不可以使用接口名调用)
//调用方式:接口名.super.方法
CompareA.super.method3();
CompareB.super.method3();
}
}
来源:https://blog.csdn.net/Robi_Candy/article/details/121046996


猜你喜欢
- Android 使用mediaplayer播放res/raw文件夹中的音乐的实例(1)在res文件夹中新建一个文件夹重命名为raw,并且将要
- springboot @ConfigurationProperties和@PropertySource区别@ConfigurationPro
- Kotlin 面向对象这几天一直在准备考试,实在没有时间,已经过去了这么久,终于要到面向对象了!先看看Kotlin中的类长什么样吧.可以看到
- 目录第一章 前言概述第01节 概述第02节 区别第二章 核心代码第01节 成员变量第02节 构造方法第三章 扩容操作第01节 扩容代码第一章
- 引言这里实现一个简单的图片上传功能,主要是熟悉这个文件上传的交互流程。关于更复杂的文件上传,如大文件的切片上传、断点续传等,这里不做过多介绍
- 本文实例为大家分享了Unity实现简单虚拟摇杆的具体代码,供大家参考,具体内容如下需求:点击创建一个虚拟摇杆底盘,鼠标拖拽时候上方摇杆会跟随
- 本文实例讲述了JAVA实现的简单万年历。分享给大家供大家参考,具体如下:import java.util.Scanner;public cl
- Model与Session区别什么是Session:Session:在计算机中,尤其是在网络应用中,称为“会话”。它具体是指一个终端用户与交
- 在Java中创建线程有两种方法:使用Thread类和使用Runnable接口。在使用Runnable接口时需要建立一个Thread实例。因此
- * 其实就是java.lang.reflect.Proxy类动态的根据您指定的所有接口生成一个class byte,该class会继承P
- 我在Eclipse/MyEclipse环境下都测试过了,都好使。需要2个组件,分别是: ext-4.0.2a.jsb2 spke
- 本文实例为大家分享了Android实现五子棋小游戏的具体代码,供大家参考,具体内容如下配图:代码:package com.example.f
- 1.摘要Android手机间通过蓝牙方式进行通信,有两种常见的方式,一种是socket方式,另一种是通过Gatt Server(Androi
- 运行本实例,将显示一个用户登录界面,输入用户名(hpuacm)和密码(1111)后,单击"登录"按钮,将弹出如下图所示的
- 前言:quartz是一个定时调度的框架,就目前市场上来说,其实有比quartz更优秀的一些定时调度框架,不但性能比quartz好,学习成本更
- 一、关键字关键字:被Java语言赋予特定含义的单词。组成关键字的字母全部小写。注:goto和const作为保留字存在,目前并不使用。main
- 实现的效果图,可左右滑动:一、先在将Gallery标签放入:<?xml version="1.0" encodin
- 一、背景项目中肯定会遇到异步调用其他方法的场景,比如有个计算过程,需要计算很多个指标的值,但是每个指标计算的效率快慢不同,如果采用同步执行的
- import java.io.ByteArrayInputStream; import java.io.FileOutputSt
- 本文主要是对Handler和消息循环的实现原理进行源码分析,如果不熟悉Handler可以参见博文《 Android中Handler的使用》,