深入理解Java8新特性之接口中的默认方法和静态方法
作者:张起灵-小哥 发布时间:2023-11-24 01:44:25
标签:Java8新特性,接口,默认,静态,方法
1.接口中的默认方法和静态方法
Java 8中允许接口中包含具有具体实现的方法,该方法称为 “默认方法” ,默认方法使用 default 关键字修饰。
接口默认方法的 ” 类优先 ” 原则。若一个接口中定义了一个默认方法,而另外一个父类或接口中又定义了一个同名的方法时
选择父类中的方法。如果一个父类提供了具体的实现,那么接口中具有相同名称和参数的默认方法会被忽略。
接口冲突。如果一个父接口提供一个默认方法,而另一个接口也提供了一个具有相同名称和参数列表的方法(不管方法是否是默认方法),那么必须覆盖该方法来解决冲突。
同时,Java8 中,允许接口中添加静态方法(static)。
2.应用举例
package com.szh.java8;
/**
*
*/
interface InterfaceOne {
default String getMessage() {
return "哈哈哈";
}
static void show() {
System.out.println("接口中的静态方法");
}
}
interface InterfaceTwo {
default String getMessage() {
return "嘿嘿嘿";
}
}
class ClassOne {
public String getMessage() {
return "呵呵呵";
}
}
class SubClass1 extends ClassOne implements InterfaceOne {
}
class SubClass2 extends ClassOne implements InterfaceOne,InterfaceTwo {
}
class SubClass3 implements InterfaceOne,InterfaceTwo {
@Override
public String getMessage() {
return InterfaceTwo.super.getMessage();
}
}
public class TestClass {
public static void main(String[] args) {
SubClass1 sub1 = new SubClass1();
System.out.println(sub1.getMessage());
SubClass2 sub2 = new SubClass2();
System.out.println(sub2.getMessage());
SubClass3 sub3 = new SubClass3();
System.out.println(sub3.getMessage());
InterfaceOne.show();
}
}
虽然SubClass1类继承了ClassOne、同时实现了InterfaceOne,由于类优先原则,所以这里执行的是ClassOne类中的getMessage方法。
SubClass2与SubClass1是同样的道理。
而SubClass3就不一样了,它没有继承ClassOne这个类,而是同时实现了InterfaceOne、InterfaceTwo这两个接口,那么它就必须选择其中一个来对默认方法进行实现(覆盖 / 重写),实现的是哪个接口,相应的就执行哪个接口的默认方法。
最后接口中的静态方法就和类中的静态方法一样,直接 接口名.静态方法名 就可以调用了。
来源:https://szh-forever-young.blog.csdn.net/article/details/121225008


猜你喜欢
- RESTful 一种软件架构风格,设计风格而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设
- IntelliJ IDEA2022 springboot 热部署 html#pom.xml<dependency>
- 在logback.xml中加上该配置,包名如:com.xxx<logger name="packageName"
- 一般我们在controller层调用service时,只需要使用@Autowired注解即可,例如如下代码我们经常看到:@RestContr
- 随着目前微信越来越火,所以研究微信的人也就越来越多,这不前一段时间,我们公司就让我做一个微信公众号中问卷调查发红包功能,经过一段时间的研究,
- 先看一下java线程运行时各个阶段的运行状态线程是进程中的一个实体,是被系 * 立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运
- 前言Android开发中经常使用findViewById来获取控件然后进行一些列操作,当控件太多的时候代码就非常臃肿,今天就来学习一个新的开
- 最近做项目,碰到如下的需求:ViewPager分页,如果是6页(包括6页)就用圆点,如果是6页以上就用进度条来切换。前面一种交互方法最常见,
- Android 四种获取屏幕宽度的方法方法一: WindowManager wm = (WindowManager) this
- 在C# winform应用程序中,用以下代码可以进行一些内存使用的优化using System;using System.Diagnosti
- for循环和foreach循环的区别首先在这里声明一点,C#和Java这两种语言很相似,尤其是初学的数据类型那一部分,所以这里写的for和f
- 一个Java程序的执行要经过编译和执行(解释)这两个步骤,同时Java又是面向对象的编程语言。当子类和父类存在同一个方法,子类重写了父类的方
- * 验证码地址:https://007.qq.com/online.html* 使用OpenCv模板匹配* 成功率90%左右* Java +
- 本文以实例形式展示了C#与js实现去除textbox文本框里面重复记录的方法!具体方法如下:现有如下问题:页面有一个textbox文本框(是
- 本文实例为大家分享了Android自定义textview实现跑马灯效果的具体代码,供大家参考,具体内容如下xml布局<?xml ver
- 在Java开发中常用到For循环,它对简化业务处理,提高效率,非常有帮助。但要防止程序算法中可能导致死循环的情况,而且有的死循环还不好察觉。
- IDEA安装后,前进 后退快捷按钮默认不在工具栏显示,需要手动将其添加到工具栏*按照图一选中Toolbar Run Actions ,点击右
- 本文研究的主要是Java虚拟机中gc日志的理解问题,具体如下。一、日志分析 理解GC日志是处理Java虚拟机内存问题的基本技能。通过在jav
- 一、序言在日常一线开发过程中,总有列表转树的需求,几乎是项目的标配,比方说做多级菜单、多级目录、多级分类等,有没有一种通用且跨项目的解决方式
- 简单了解计算机为什么要采用二进制表示信息:因为计算机作为一种电子计算机工具,是由大量的电子器件组成的,在这些电子器件中,电路的通断,电位的高