相信如果是第一次学习接口的同学可能会产生一个疑惑?什么疑惑呢?
首先接口长成这样
interface Exampleinterface
{
void something();
}
interface Exampleinterace1
{
void something1();
}
我们可以通过implements关键字,实现多个接口继承。
class Ex implements Exampleterface,Exampleinterface1
{...}
那想必抽象类大家都学过了,表示一种更高层次的类,往往充当占位的角色,功能与接口十分相似,只是声明和继承的关键子不一样。那为什么不直接继承多个抽象类,像这样
abstract class Ex0
{
public abstract void something();
}
abstract class Ex1
{
abstract void something();
}
class Test extends Ex0,Ex1//会报错
{
public void something() {
}
}
这是因为Java不支持一个类多个继承类。为什么Java不支持多继承呢?
好,既然Java不支持我们先看看那些语言支持吧,这里我们就以Python,和C++来说明,多继承如何工作的。
首先需要了解一下多继承的二义性问题二义性问题
二义性问题:当b1,b2都继承A时,假设A类有个f()方法都被b1,b2重写。此时c在同时继承b1,b2当调用f()方法时,就无法确定调用那个方法。
首先Python多继承也会遇到二义性的问题,这里Python用的及时MRO机制,最早MRO利用的深度优先算法,但是有缺陷,只能对一个类进行重写,后来改成c3算法,主要利用的是广度优先算法,就很好确立了方法调用的顺序。
而C++的多继承则是同过虚继承来解决这个问题。二者在面对多继承的二义性问题时都十分复杂难以理解,笔者看了半天也就明白个大概,就不仔细说了。所以Java语言的设计者在面对 这个问题的时候,坚持着Java是简单易学的特性,放弃了多继承这个特性,转而利用多继承接口来实现多继承的类似功能。