java中的多继承和C++中的多继承问题

先来看看多继承会带来的问题,继承容易致使钻石危机(也称棱形问题,一幅图来讲说明: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();

    }

}

相关文章
相关标签/搜索