Java中接口是否可以继承多个接口?
可以。
接口是常量值和方法定义的集合。接口是一种特殊的抽象类。
java类是单继承的。classB Extends classA
java接口可以多继承。Interface3 Extends Interface0, Interface1, interface……
不允许类多重继承的主要原因是,如果A同时继承B和C,而B和C同时有一个D方法,A如何决定该继承那一个呢?
但接口不存在这样的问题,接口全都是抽象方法继承谁都无所谓,所以接口可以继承多个接口。
注意:
1)一个类如果实现了一个接口,则要实现该接口的所有方法。
2)方法的名字、返回类型、参数必须与接口中完全一致。如果方法的返回类型不是void,则方法体必须至少有一条return语句。
3)因为接口的方法默认是public类型的,所以在实现的时候一定要用public来修饰(否则默认为protected类型,缩小了方法的使用范围)。
详解:
最近在读一些源码的时候突然发现了一个很神奇的东西,它的原始形态是这样的:

在这行代码中,BlockingDeque、BlockingQueue和Deque是三个接口。刚发现这个问题时,我是十分吃惊的,因为即使在《Thinking in Java》中也没有提到接口之间的继承。所以我立即把这个疑问提交到了stackoverflow上面。
这个问答的过程十分简单,在这个链接上面的:http://stackoverflow.com/questions/22498245/one-uncertainty-on-multiple-inheritance-in-universal-image-loader
正如在stackoverflow上面所讨论的一样,一个类只能extends一个父类,但可以implements多个接口。java通过使用接口的概念来取代C++中多继承。与此同时,一个接口则可以同时extends多个接口,却不能implements任何接口。因而,Java中的接口是支持多继承的。
然后我又做了个实验,来验证如果多个父子接口中有多个相同的方法声明,然后在实现这个最终的接口的时候,相同的方法声明在实现的时候会不会有冲突呢?
首先写了个接口:TestInterfaceA.java:
package com.peter.java.dsa.interfaces;
public interface TestInterfaceA {
String pri_key = "guess what the private key is";
int add(int x, int y);
String encryt(byte[] result);
int get();
}
然后再与了一个接口:TestInterfaceB.java:
package com.peter.java.dsa.interfaces;
public interface TestInterfaceB {
String pub_key = "guess what the public key is";
int minus(int x, int y);
byte[] decryt(String src);
int get();
}
里面也声明了三个方法和一个变量;
然后再定义了一个接口InterfaceMultiInheritance.java同时继承了接口TestInterfaceA.java和接口TestInterfaceB.java:
package com.peter.java.dsa.interfaces;
public interface InterfaceMultiInheritance extends TestInterfaceA, TestInterfaceB {
int num = 1024;
double divide(int x, int y);
int get();
}
里面声明了两个方法和一个变量;
注意,在这三个接口中,有一个共同的方法声明:get()。这个都是要讨论的主题。
最后在一个类InterfaceImplementTest.java中实现了接口InterfaceMultiInheritance.java,源码如下:
package com.peter.java.dsa.common; import com.peter.java.dsa.interfaces.InterfaceMultiInheritance;
import com.sun.org.apache.xml.internal.security.exceptions.Base64DecodingException;
import com.sun.org.apache.xml.internal.security.utils.Base64; public class InterfaceImplementTest implements InterfaceMultiInheritance { @Override
public int add(int x, int y) {
// TODO Auto-generated method stub
return x + y;
} @Override
public String encryt(byte[] result) {
// TODO Auto-generated method stub
return Base64.encode(result);
} @Override
public int minus(int x, int y) {
// TODO Auto-generated method stub
return x - y;
} @Override
public byte[] decryt(String src) {
// TODO Auto-generated method stub
try {
return Base64.decode(src);
} catch (Base64DecodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
} @Override
public double divide(int x, int y) {
// TODO Auto-generated method stub
return x/y;
} @Override
public int get() {
// TODO Auto-generated method stub
return num;
} public void print() {
System.out.println("The public key is: "+pub_key+"\nThe private key is: "+pri_key);
} }
在这个类中,只有一个get方法实现了,同时也没有为有多个get要实现而冲突。同时,如果删除了接口InterfaceMultiInheritance.java中的get方法,也只有一个get方法得到了实现并且没有为多个get要实现而出现什么冲突。
所以,我们可以得到一个结论,当编译器在实现接口的时候会依然检查接口InterfaceMultiInheritance.java、TestInterfaceA.java和TestInterfaceB.java中的方法声明,如果后两者有与前者相冲突的方法声明,编译器将只要求类实现前者的声明,而后两者中相同的方法声明将自动被忽略。而当只有后两者中有相同的方法声明时,编译器将实现其中的一个即可。就好像是编译器中有一个专门存储方法声明的Set一样,在有继承关系的接口中,只保存一次相同的方法声明。
参考:
1、https://blog.csdn.net/tiantiandjava/article/details/46514783
Java中接口是否可以继承多个接口?的更多相关文章
- 为什么说JAVA中要慎重使用继承 C# 语言历史版本特性(C# 1.0到C# 8.0汇总) SQL Server事务 事务日志 SQL Server 锁详解 软件架构之 23种设计模式 Oracle与Sqlserver:Order by NULL值介绍 asp.net MVC漏油配置总结
为什么说JAVA中要慎重使用继承 这篇文章的主题并非鼓励不使用继承,而是仅从使用继承带来的问题出发,讨论继承机制不太好的地方,从而在使用时慎重选择,避开可能遇到的坑. JAVA中使用到继承就会有两 ...
- Java中的集合(十二) 实现Map接口的WeakHashMap
Java中的集合(十二) 实现Map接口的WeakHashMap 一.WeakHashMap简介 WeakHashMap和HashMap一样,WeakHashMap也是一个哈希表,存储的也是键值对(k ...
- 转:Java中子类是否可以继承父类的static变量和方法而呈现多态特性
原文地址:Java中子类是否可以继承父类的static变量和方法而呈现多态特性 静态方法 通常,在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法,关于static方法,声明 ...
- HashMap和Hashtable的区别--List,Set,Map等接口是否都继承自Map接口--Collection和Collections的区别
面试题: 1.HashMap和Hashtable的区别? HashMap:线程不安全,效率高,键和值都允许null值 Hashtable:线程安全,效率低,键和值都不允许null值 ArrayList ...
- Java中的封装、继承、多态
封装 在如何理解面向对象这篇文章中,提到所谓的封装就是"功能都给你做好了,你不必去理解它是怎么写出来的,直接使用即可.".但你得清楚一点,那就是这句话是相对于使用者来说的,而作为开 ...
- java中static关键字的继承问题
结论:java中静态属性和静态方法可以被继承,但是没有被重写(overwrite)而是被隐藏. 原因: 1). 静态方法和属性是属于类的,调用的时候直接通过类名.方法名完成对,不需要继承机制及可以调用 ...
- 关于Java中的几种特殊类与接口,及特殊的创建实例的方法
Java中有一些特殊的类,在教材中讲解的不深,但是确实非常有用的,这里总结一下,里面用到的有网上搜到的内容,这里表示下感谢. 一.成员内部类 成员内部类是在一个内中定义的另外一个类,这个类属于其上的类 ...
- java中的集合:继承关系和简介
1.继承关系图 2.Collection接口 Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements).一些Collect ...
- Java面试题:Java中的集合及其继承关系
关于集合的体系是每个人都应该烂熟于心的,尤其是对我们经常使用的List,Map的原理更该如此.这里我们看这张图即可: 1.List.Set.Map是否继承自Collection接口? List.Set ...
随机推荐
- failOnMissingWebXml
使用maven创建项目时有时在pom.xml的war处出现failOnMissingWebXml的错误,根据错误提示的原因可以知道项目是web项目,打包时打成war包. 如果项目里没有web.xml, ...
- ps填充颜色快捷键
一:选中区域: 二:填充前景色快捷键是“Alt+Delete”: 三:填充背景色的键盘快捷键是“Ctrl+Delete”:
- java使用新的(nio)遍历文件(支持文件后缀名、文件名正则表达式匹配)
import org.junit.Test; import java.io.IOException; import java.nio.file.Files; import java.nio.file. ...
- nginx和php-fpm 是使用 tcp socket 还是 unix socket ?
转自 http://blog.csdn.net/qq624202120/article/details/60957634 从上面的图片可以看,unix socket减少了不必要的tcp开销,而tcp需 ...
- Unity和Android交互学习
这段时间学习Unity和Android互调,从基础开始. 网上的教程有很多,浏览了一圈教程,发现目前有两种方式:一种是直接把 .aar文件导入Unity/Plugins/Android文件夹,另一种是 ...
- 日常小节----unity小坑记(射线检测固定层级)
unity中射线检测需设定所需层级时,必须加上距离!!! //一条从主相机到屏幕点击点的射线 Ray ray = Camera.Main.ScreenPointToRay(Input.mousePos ...
- github pages + hexo 搭建 blog 遇到的问题
一. ERROR Deployer not found: git $ hexo d ERROR Deployer not found: git npm install --save hexo-depl ...
- vscode使用Chrome浏览器调试不好用,解决方法!!
1.如果你是刚下载vscode,那么你需要下载两个插件. 1. open in browser(在浏览器中查看,支持五大主流浏览器),下载并启用. 2. view-in-browser (在浏览器中查 ...
- hadoop java VM 参数设置 默认native栈大小设置
问题总结: 程序栈太小,64位机器的栈大小默认比32位的大,将程序从64放到32中执行则报错,需要修改初始堆栈大小 (.so库中提供两个函数接口,一个里面使用的是尺寸较大的图像,另一个处理的图像很小, ...
- Zookeeper概述、特点、数据模型
Zookeeper 1.Zookeeper概述 Zookeeper是一个工具,可以实现集群中的分布式协调服务. 所谓的分布式协调服务,就是在集群的节点中进行可靠的消息传递,来协调集群的工作. Zo ...