先来看看多继承会带来的问题,继承容易致使钻石危机(也称棱形问题),一幅图来讲说明:java
假设 类A 中有一个public方法 fun(),而后 类B 和 类C 同时继承了 类A,在 类B 或 类C 中各自对方法 fun()进行了覆盖,这时 类D 经过多继承同时继承了 类B 和 类C,这样便致使钻石危机了,程序在运行的时候对于方法 fun()该如何判断?ui
总结以下,主要有两个方面:spa
(1)若是在一个子类继承的多个父类中拥有相同名字的实例变量,子类在引用该变量时将产生歧义,没法判断应该使用哪一个父类的变量。 (2)若是在一个子类继承的多个父类中拥有相同方法,子类中有没有覆盖该方法,那么调用该方法时将产生歧义,没法判断应该调用哪一个父类的方法。 在接口中不能有实例变量,只能有静态的常量,不能有具体的方法(包含方法体),只能有抽象方法,所以也就摒弃了多继承的缺点。 对于一个类实现多个接口的状况,由于接口只有抽象方法,具体方法只能由实现接口的类实现,在调用的时候始终只会调用实现类的方法(不存在歧义),所以不存在 多继承的第二个缺点;而又由于接口只有静态的常量,可是因为静态变量是在编译期决定调用关系的,即便存在必定的冲突也会在编译时提示出错;而引用静态变量通常直接使用类名或接口名,从而避免产生歧义,所以也不存在多继承的第一个缺点。 对于一个接口继承多个父接口的状况也同样不存在这些缺点。
可是java中能够用接口和内部类的方式来间接达到多继承的效果:code
//这是经过接口来间接实现多继承的继承
interface HowEat{接口
public abstract String howeat();ci
}it
class Chenken implements HowEat{编译
public String howeat(){class
return "chicken: fry it ";
}
}
class Orange implements HowEat{
public String howeat(){
return "orangr: make it juice";
}
}
//这是经过内部类来实现的
class Father{
public void output(){
System.out.println("father");
}
}
class Mother{
public void output(){
System.out.println("mather");
}
}
class son{
class Father_son extends Father{
}
class Mother_son extends Mother{
}
public void father(){
(new Father_son()).output();
}
public void mather(){
(new Mother_son()).output();
}
}