我们都知道,接口是一种特殊的抽象类。在java语言中,类是单继承的,无法实现有多个父类的情况,但是接口很特殊,可以实现多继承,例如Interface2 extends Interface0, Interface1。
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类型,缩小了方法的使用范围)。