Java接口多继承的问题

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();


 

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值