java 一个类实现两个接口的案例
作者:ymzdb7 发布时间:2023-08-09 12:24:35
标签:java,一个类,接口
直接用英文逗号分隔就可以了,比如:
inerface IHello {
String sayHello(String name);
}
interface IHi {
String sayHi(String name);
}
class ServiceImpl implements IHello, IHi {// 实现三个四个。。。n个接口都是使用逗号分隔
public String sayHello(String name) {
return "Hello, " + name;
}
public String sayHi(String name) {
return "Hi, " + name;
}
}
补充知识:Java 一个类实现的多个接口,有相同签名的default方法会怎么办?
看代码吧~
public interface A {
default void hello() {
System.out.println("Hello from A");
}
}
public interface B extends A {
default void hello() {
System.out.println("Hello from B");
}
}
public class C implements B, A {
public static void main(String... args) {
new C().hello();
}
}
这段代码,会打印什么呢?
有三条规则
类永远赢。类声明的方法,或者超类声明的方法,比default方法的优先级高
否则,子接口赢
否则,如果集成自多个接口,必须明确选择某接口的方法
上面代码的UML图如下
所以,上面的代码,输出是
Hello from B
如果这样呢?
public class D implements A{
}
public class C extends D implements B, A {
public static void main(String... args) {
new C().hello();
}
}
UML图是这样的
规则1说,类声明的方法优先级高,但是,D没有覆盖hello方法,它只是实现了接口A。所以,它的default方法来自接口A。规则2说,如果类和超类没有方法,就是子接口赢。所以,程序打印的还是“Hello from B”。
所以,如果这样修改代码
public class D implements A{
void hello(){
System.out.println("Hello from D");
}
}
public class C extends D implements B, A {
public static void main(String... args) {
new C().hello();
}
}
程序的输出就是“Hello from D”。
如果D这样写
public abstract class D implements A {
public abstract void hello();
}
C就只能实现自己的抽象方法hello了。
如果是这样的代码呢
public interface A {
default void hello() {
System.out.println("Hello from A");
}
}
public interface B {
default void hello() {
System.out.println("Hello from B");
}
}
public class C implements B, A {
}
UML图如下
会生成这样的编译器错误
"Error: class C inherits unrelated defaults for hello() from types B and A."
怎么修改代码呢?只能明确覆盖某接口的方法
public class C implements B, A {
void hello(){
B.super.hello();
}
}
如果代码是这样的,又会怎样呢?
public interface A{
default void hello(){
System.out.println("Hello from A");
}
}
public interface B extends A {
}
public interface C extends A {
}
public class D implements B, C {
public static void main(String... args) {
new D().hello();
}
}
UML图是这样的
很明显,还是不能编译。
来源:https://blog.csdn.net/ymzdb7/article/details/88696379
0
投稿
猜你喜欢
- 概述什么是 Spring WebFlux, 它是一种异步的, 非阻塞的, 支持背压(Back pressure)机制的Web 开发框架. 要
- 1.object:匿名内部类在Android最常用的匿名内部类之一就是点击事件,用Java语言写的话就是下面这样:public interf
- 本文实例为大家分享了DatePicker日期滚动选择的使用,供大家参考,具体内容如下效果图为:1.dialog_date.xml:<?
- 基本哪些属于引用类型类(object,string),接口、数组、委托引用类型分配在哪里引用类型变量位于线程栈。引用类型实例分配在托管堆上。
- 1. 最小生成树连通图中的每一棵生成树 , 都是原图的极大无环子图 , 即: 从中删去任何一条边 , 生成树就不再连通;反之 , 在其中引入
- 目录(?)[-]一扩展javalangThread类二实现javalangRunnable接口三Thread和Runnable的区别四线程状
- 1使用背景在实际项目中其中一部分逻辑可能会因为调用了外部服务或者等待锁等情况下出现不可预料的异常,在这个时候我们可能需要对调用这部分逻辑进行
- 一、简介Lock关键字是Monitor的一种替换用法,lock在IL代码中会被翻译成Monitor. lock (obj) &nb
- 本文实例为大家分享了C# GDI+实现时钟表盘的具体代码,供大家参考,具体内容如下一、设计如下图界面按键“打开时钟&am
- 本文实例讲述了C#实现生成所有不重复的组合功能。分享给大家供大家参考,具体如下:给你几个字母,比如(a,b,c,d,e,f),要求生成所有不
- 本文实例讲述了Android编程之SharedPreferences文件存储操作的方法。分享给大家供大家参考。具体分析如下:SharedPr
- 前段时间写了一篇基于mybatis实现的多数据源博客。感觉不是很好,这次打算加入git,来搭建一个基于Mybatis-Plus的多数据源项目
- 实践过程效果代码public partial class Form1 : Form{ private HookEx
- 前言:学习了SpringBoot分页查询的两种写法,一种是手动实现,另一种是使用框架实现。现在我将具体的实现流程分享一下。首先是手动实现分页
- public String[] split(String regex) 默认limit为0public String[] split(Str
- 一. 下载环境Ubuntu 2.x.x 版本二. 创建Hadoop用户在虚拟机创建安装完成后。1.进入用户,打开终端输入如下命令:sudo
- 前言:创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口。这2种方式都有一个缺陷就是:在执行完任务之后无法
- C#支持的位逻辑运算符如表2.9所示。运算符号意义运算对象类型运算结果类型对象数实例~位逻辑非运算整型,字符型整型1~a&位逻辑与运
- 一、使用maven加载依赖加载了连接数据库的依赖、mybatis的依赖以及lombok的依赖<dependency>  
- 1.docker安装seata 1.3.0镜像docker pull seataio/seata-server:1.3.02.运行容器获取配