可以。

接口是常量值和方法定义的集合。接口是一种特殊的抽象类。

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

2、https://www.cnblogs.com/littlepanpc/p/3616300.html

Java中接口是否可以继承多个接口?的更多相关文章

  1. 为什么说JAVA中要慎重使用继承 C# 语言历史版本特性(C# 1.0到C# 8.0汇总) SQL Server事务 事务日志 SQL Server 锁详解 软件架构之 23种设计模式 Oracle与Sqlserver:Order by NULL值介绍 asp.net MVC漏油配置总结

    为什么说JAVA中要慎重使用继承   这篇文章的主题并非鼓励不使用继承,而是仅从使用继承带来的问题出发,讨论继承机制不太好的地方,从而在使用时慎重选择,避开可能遇到的坑. JAVA中使用到继承就会有两 ...

  2. Java中的集合(十二) 实现Map接口的WeakHashMap

    Java中的集合(十二) 实现Map接口的WeakHashMap 一.WeakHashMap简介 WeakHashMap和HashMap一样,WeakHashMap也是一个哈希表,存储的也是键值对(k ...

  3. 转:Java中子类是否可以继承父类的static变量和方法而呈现多态特性

    原文地址:Java中子类是否可以继承父类的static变量和方法而呈现多态特性 静态方法 通常,在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法,关于static方法,声明 ...

  4. HashMap和Hashtable的区别--List,Set,Map等接口是否都继承自Map接口--Collection和Collections的区别

    面试题: 1.HashMap和Hashtable的区别? HashMap:线程不安全,效率高,键和值都允许null值 Hashtable:线程安全,效率低,键和值都不允许null值 ArrayList ...

  5. Java中的封装、继承、多态

    封装 在如何理解面向对象这篇文章中,提到所谓的封装就是"功能都给你做好了,你不必去理解它是怎么写出来的,直接使用即可.".但你得清楚一点,那就是这句话是相对于使用者来说的,而作为开 ...

  6. java中static关键字的继承问题

    结论:java中静态属性和静态方法可以被继承,但是没有被重写(overwrite)而是被隐藏. 原因: 1). 静态方法和属性是属于类的,调用的时候直接通过类名.方法名完成对,不需要继承机制及可以调用 ...

  7. 关于Java中的几种特殊类与接口,及特殊的创建实例的方法

    Java中有一些特殊的类,在教材中讲解的不深,但是确实非常有用的,这里总结一下,里面用到的有网上搜到的内容,这里表示下感谢. 一.成员内部类 成员内部类是在一个内中定义的另外一个类,这个类属于其上的类 ...

  8. java中的集合:继承关系和简介

    1.继承关系图 2.Collection接口 Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements).一些Collect ...

  9. Java面试题:Java中的集合及其继承关系

    关于集合的体系是每个人都应该烂熟于心的,尤其是对我们经常使用的List,Map的原理更该如此.这里我们看这张图即可: 1.List.Set.Map是否继承自Collection接口? List.Set ...

随机推荐

  1. spark入门备忘---1

    import org.apache.spark.{SparkContext, SparkConf} import scala.math.random /** * 利用spark进行圆周率的计算 */ ...

  2. 一个BADI创建了两个实施会有什么问题呢?

    BADI :LE_SHP_DELIVERY_PROC 创建了两个实施,会导致什么问题呢? 前台测试  调试 VL01N 进了这个断点:ZCL_IM_IM_LE_SHP_DELIV_001 F8之后  ...

  3. JAVA 基础编程练习题40 【程序 40 字符串排序】

    40 [程序 40 字符串排序] 题目:字符串排序. package cskaoyan; public class cskaoyan40 { @org.junit.Test public void a ...

  4. phpcms后台添加会员报v9_sso_member表缺失

    坑货..表前缀设置 两个地方都有 一个是默认的caches/configs/目录 还有个是phpsso_server/caches/configs/ 如果改了表前缀 这两个地方的database都要改 ...

  5. 极客时间-左耳听风-程序员攻略-Java底层知识

    Java 字节码相关 字节码编程,也就是动态修改或是动态生成 Java 字节码.Java 的字节码相当于汇编,其中的一些细节. Java Zone: Introduction to Java Byte ...

  6. 常用的linux命令选项

    -a 显示所有对象 -c 生成一个计数 -d 制定一个目录 -e 扩展一个对象 -f 指定读入数据的文件 -h 显示命令的帮助信息 -i 忽略文本大小写 -l 产生输出的成格式版本 -n 使用非交互模 ...

  7. C#实现多线程的方式:Task——任务

    简介 .NET 4包含新名称空间System.Threading.Tasks,它 包含的类抽象出了线程功能. 在后台使用ThreadPool. 任务表示应完成的某个单元的工作. 这个单元的工作可以在单 ...

  8. 日历插件 js

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. ######【Python】【基础知识】【一些未知的知识点】######

    在查资料.看书过程中遇到的一些未知的领域.知识点: 1.模仿静态变量 可参考: https://www.runoob.com/python/python-exercise-example41.html ...

  10. IDEA插件之JProfiler

    1.是什么?来用干嘛的? 一个商业授权的Java剖析工具. 用来剖析程序内存.CPU使用情况,找到性能瓶颈,快速定位问题所在. 2.IDEA安装JProfiler插件 (1)File -> Se ...