然后再与了一个接口:TestInterfaceB.java:
1 package com.peter.java.dsa.interfaces; 2 public interface TestInterfaceB 3 String pub_key = "guess what the public key is"; 4 int minus(int x, int y); 5 byte[] decryt(String src); 6 int get(); 7
里面也声明了三个方法和一个变量;
然后再定义了一个接口InterfaceMultiInheritance.java同时继承了接口TestInterfaceA.java和接口TestInterfaceB.java:
1 package com.peter.java.dsa.interfaces; 2 3 public interface InterfaceMultiInheritance extends TestInterfaceA, TestInterfaceB 4 int num = 1024; 5 double divide(int x, int y); 6 int get(); 7
里面声明了两个方法和一个变量;
注意,在这三个接口中,有一个共同的方法声明: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一样,在有继承关系的接口中,只保存一次相同的方法声明。
参考:
1、https://blog.csdn.net/tiantiandjava/article/details/46514783