java中接口是否可以继承多个接口?
以下内容转自:http://blog.csdn.net/tiantiandjava/article/details/46514783
接口是常量值和方法定义的集合。接口是一种特殊的抽象类。
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类型,缩小了方法的使用范围)。
以下内容转自:http://www.cnblogs.com/littlepanpc/p/3616300.html
最近在读一些源码的时候突然发现了一个很神奇的东西,它的原始形态是这样的:
在这行代码中,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:

1 package com.peter.java.dsa.interfaces; 2 3 public interface TestInterfaceA { 4 String pri_key = "guess what the private key is"; 5 6 int add(int x, int y); 7 8 String encryt(byte[] result); 9 10 int get(); 11 }
注意,里面声明了三个方法和一个变量;
然后再与了一个接口:TestInterfaceB.java:

1 package com.peter.java.dsa.interfaces; 2 3 public interface TestInterfaceB { 4 String pub_key = "guess what the public key is"; 5 6 int minus(int x, int y); 7 8 byte[] decryt(String src); 9 10 int get(); 11 }
里面也声明了三个方法和一个变量;
然后再定义了一个接口InterfaceMultiInheritance.java同时继承了接口TestInterfaceA.java和接口TestInterfaceB.java:

1 package com.peter.java.dsa.interfaces; 2 3 public interface InterfaceMultiInheritance extends TestInterfaceA, 4 TestInterfaceB { 5 int num = 1024; 6 7 double divide(int x, int y); 8 9 int get(); 10 }
里面声明了两个方法和一个变量;
注意,在这三个接口中,有一个共同的方法声明:get()。这个都是要讨论的主题。
最后在一个类InterfaceImplementTest.java中实现了接口InterfaceMultiInheritance.java,源码如下:

1 package com.peter.java.dsa.common; 2 3 import com.peter.java.dsa.interfaces.InterfaceMultiInheritance; 4 import com.sun.org.apache.xml.internal.security.exceptions.Base64DecodingException; 5 import com.sun.org.apache.xml.internal.security.utils.Base64; 6 7 public class InterfaceImplementTest implements InterfaceMultiInheritance { 8 9 @Override 10 public int add(int x, int y) { 11 // TODO Auto-generated method stub 12 return x + y; 13 } 14 15 @Override 16 public String encryt(byte[] result) { 17 // TODO Auto-generated method stub 18 return Base64.encode(result); 19 } 20 21 @Override 22 public int minus(int x, int y) { 23 // TODO Auto-generated method stub 24 return x - y; 25 } 26 27 @Override 28 public byte[] decryt(String src) { 29 // TODO Auto-generated method stub 30 try { 31 return Base64.decode(src); 32 } catch (Base64DecodingException e) { 33 // TODO Auto-generated catch block 34 e.printStackTrace(); 35 } 36 return null; 37 } 38 39 @Override 40 public double divide(int x, int y) { 41 // TODO Auto-generated method stub 42 return x/y; 43 } 44 45 @Override 46 public int get() { 47 // TODO Auto-generated method stub 48 return num; 49 } 50 51 public void print() { 52 System.out.println("The public key is: "+pub_key+"\nThe private key is: "+pri_key); 53 } 54 55 }
在这个类中,只有一个get方法实现了,同时也没有为有多个get要实现而冲突。同时,如果删除了接口InterfaceMultiInheritance.java中的get方法,也只有一个get方法得到了实现并且没有为多个get要实现而出现什么冲突。
所以,我们可以得到一个结论,当编译器在实现接口的时候会依然检查接口InterfaceMultiInheritance.java、TestInterfaceA.java和TestInterfaceB.java中的方法声明,如果后两者有与前者相冲突的方法声明,编译器将只要求类实现前者的声明,而后两者中相同的方法声明将自动被忽略。而当只有后两者中有相同的方法声明时,编译器将实现其中的一个即可。就好像是编译器中有一个专门存储方法声明的Set一样,在有继承关系的接口中,只保存一次相同的方法声明。
Just remember: Half is worse than none at all.
45 @Override 46 public int get() { 47 // TODO Auto-generated method stub 48 return num; 49 } 50 51 public void print() { 52 System.out.println("The public key is: "+pub_key+"\nThe private key is: "+pri_key); 53 } 54 55 }
在这个类中,只有一个get方法实现了,同时也没有为有多个get要实现而冲突。同时,如果删除了接口InterfaceMultiInheritance.java中的get方法,也只有一个get方法得到了实现并且没有为多个get要实现而出现什么冲突。
所以,我们可以得到一个结论,当编译器在实现接口的时候会依然检查接口InterfaceMultiInheritance.java、TestInterfaceA.java和TestInterfaceB.java中的方法声明,如果后两者有与前者相冲突的方法声明,编译器将只要求类实现前者的声明,而后两者中相同的方法声明将自动被忽略。而当只有后两者中有相同的方法声明时,编译器将实现其中的一个即可。就好像是编译器中有一个专门存储方法声明的Set一样,在有继承关系的接口中,只保存一次相同的方法声明。
Just remember: Half is worse than none at all.
本文是由SilentKnight诚意发布, 欢迎转载! 但转载请注明出处: 【SilentKnight】
如果觉得还有帮助的话,可以点一下右下角的【推荐】,希望能够持续的为大家带来更好的技术文章!
想跟我一起进步么?那就【关注】我吧
如果,想给予我更多的鼓励,求打
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异