1 单继承、多实现
Java有一个很重要的特性即单继承,多实现。假设我们有一个子类继承了两个父类,但是两个父类有同名、同返回值、同参数的方法method(),那么当子类调用这个方法的时候,JVM并不知道该执行哪一个方法,所以在绝大多数情况下,Java中是不可以实现多继承的。为了实现类似多继承的功能,Java提供了接口Interface这个神器,我们可以通过实现多个接口来实现相关功能。
2 多继承问题
一个普通的类可以实现接口,那么如果一个接口有没有可能实现或者是继承另一个接口呢?带着这个问题,进入IDE做相关测试。
当写成implements时,编译器报错了。从原理上来说 implements表示实现的意思,然而在接口对象中是不可以写方法体的,所以我们的接口并不能实现某个接口,及接口与接口之间如果要发生关系只能是继承。
当把implements换成extends后,IDE并没有继续报错,说明我们的接口确实可以实现多继承!
3 代码测试
下面是三个接口的实现代码,其中三个接口都写了一个同样的方法void eat(),同时写了三个参数不一样的同名方法int get(),还定义了三个属性int INTERFACE_NUM。
public interface MyInterface {
int INTERFACE_NUM = 1;
int get(int a);
void eat();
}
public interface MyInterface2 {
int INTERFACE_NUM = 2;
int get(int a, int b);
void eat();
}
public interface MyInterface3 extends MyInterface, MyInterface2 {
int INTERFACE_NUM = 3;
int get(int a, int b, int c);
void eat();
}
写一个Interface来实现第三个接口,编译器自动帮我们列出了需要实现的方法虽然我们是实现了3接口,但是1和2中的方法依然需要在测试类中进行实现。可以看到不同参数的同名方法需要进行不同的实现,同名同参同返回的函数只需要实现一次即可,并不会发生冲突
public class InterfaceTest implements MyInterface3 {
@Override
public int get(int a) {
return a;
}
@Override
public int get(int a, int b) {
return a+b;
}
@Override
public int get(int a, int b, int c) {
return a+b+c;
}
@Override
public void eat() {
System.out.println("InterfaceTest is eating...");
}
}
最后写一个main方法来调用它。这里注意最后一句,我使用的是it.INTERFACE_NUM,编译器是不推荐这种方法的,因为接口里属性默认都为public static final,建议使用类名.属性来使用,需要注意的是,这里输出的数值为3,也就是说在接口集成后,同名的属性会被子类覆盖!
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
InterfaceTest it = new InterfaceTest();
System.out.println("MyInterface的get方法输出:" + it.get(1));
System.out.println("MyInterface2的get方法输出:" + it.get(1,1));
System.out.println("MyInterface3的get方法输出:" + it.get(1, 1, 1));
it.eat();
System.out.println(it.INTERFACE_NUM);
}
}
输出的结果如下:
MyInterface的get方法输出:1
MyInterface2的get方法输出:2
MyInterface3的get方法输出:3
InterfaceTest is eating...
3
4 接口对象中的编程规范
需要注意的两点是,在接口中所有的属性默认为public static final,所有的方法默认为public abstract。如果在前面修饰了与之冲突的修饰符编译器会报错。
根据《阿里巴巴开发手册》的建议,为了提高程序的可读性,接口中的属性和方法一律不加修饰符,属性全部使用大写字母用下划线连接。
正例:
int INTERFACE_TEST_NUM = 1;
void method();
反例:
//编译错误
private static final INTERFACE_TEST_NUM = 1;
private void method();
//不推荐
public static final INTERFACE_TEST_NUM_2 = 1;
public abstract void method();