java中不允许类多重继承,这样就不会有如果A同时继承B和C,而B和C同时有一个D方法,那么我们无法确定A到底继承了哪一个方法。
但是难道接口就不会有这样的问题吗?
猜想是因为接口里面都是抽象方法,继承谁都没有很大区别,所以接口可以继承多个接口。
一个类只能extends一个父类,但可以implements多个接口。java通过使用接口的概念来实现多继承。与此同时,一个接口则可以同时extends多个接口,却不能implements任何接口。因而,Java中的接口是支持多继承的。
那会不会有调用冲突的情况呢?这里做了如下测试:
先创建了一个接口InterfaceA:
public interface InterfaceA { String pri_key = "guess what the private key is"; int add(int x, int y); String encryt(byte[] result); int get(); }
再创建一个接口InterfaceB:
public interface InterfaceB { String pub_key = "guess what the public key is"; int minus(int x, int y); byte[] decryt(String src); int get(); }
然后接口InterfaceC分别继承他们两个:
public interface InterfaceC extends InterfaceA, InterfaceB { int num = 1024; double divide(int x, int y); int get(); }
再创建一个类来实现InterfaceC:
public class InterfaceD implements InterfaceC { @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要实现而冲突。同时,如果删除了接口InterfaceC.java中的get方法,也只有一个get方法得到了实现并且没有为多个get要实现而出现什么冲突。
所以,我们可以得到一个结论,当编译器在实现接口的时候会依然检查接口InterfaceC.java、InterfaceA.java和InterfaceB.java中的方法声明,如果后两者有与前者相冲突的方法声明,编译器将只要求类实现前者的声明,而后两者中相同的方法声明将自动被忽略。而当只有后两者中有相同的方法声明时,编译器将实现其中的一个即可。就好像是编译器中有一个专门存储方法声明的Set一样,在有继承关系的接口中,只保存一次相同的方法声明。
注意:
1)一个类如果实现了一个接口,则要实现该接口的所有方法。2)方法的名字、返回类型、参数必须与接口中完全一致。如果方法的返回类型不是void,则方法体必须至少有一条return语句。
3)因为接口的方法默认是public类型的,所以在实现的时候一定要用public来修饰(否则默认为protected类型,缩小了方法的使用范围)。
参考了http://stackoverflow.com/questions/22498245/one-uncertainty-on-multiple-inheritance-in-universal-image-loader上的问答和https://blog.csdn.net/tiantiandjava/article/details/46514783