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

java中接口之间的继承

最近在读一些源码的时候突然发现了一个很神奇的东西,它的原始形态是这样的:

在这行代码中,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一样,在有继承关系的接口中,只保存一次相同的方法声明。

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一样,在有继承关系的接口中,只保存一次相同的方法声明。

评论 1 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值