1. 程式人生 > >面試題-實現多重繼承

面試題-實現多重繼承

多重繼承指的是一個類可以同時從多於一個的父類那裡繼承行為和特徵,然而我們知道Java為了保證資料安全,它只允許單繼承。有些時候我們會認為如果系統中需要使用多重繼承往往都是糟糕的設計,這個時候我們往往需要思考的不是怎麼使用多重繼承,而是您的設計是否存在問題.但有時候我們確實是需要實現多重繼承,而且現實生活中也真正地存在這樣的情況,比如遺傳:我們即繼承了父親的行為和特徵也繼承了母親的行為和特徵。可幸的是Java是非常和善和理解我們的,它提供了兩種方式讓我們曲折來實現多重繼承:介面和內部類。

一、 介面

在介紹介面和抽象類的時候瞭解到子類只能繼承一個父類,也就是說只能存在單一繼承,但是卻可以實現多個介面,這就為我們實現多重繼承做了鋪墊。
對於介面而已,有時候它所表現的不僅僅只是一個更純粹的抽象類,介面是沒有任何具體實現的,也就是說,沒有任何與介面相關的儲存,因此也就無法阻止多個介面的組合了。

interface CanFight{
    void fight();
}
interface CanSwim{
    void swim();
}
interface CanFly{
    void fly();
}
class ActionCharacter{
    public void fight(){
        System.out.println("I can fight!");
    }
}
class Hero extends ActionCharacter implements CanFight,CanSwim,CanFly{
    public
void swim(){ System.out.println("I can swim!"); } public void fly(){ System.out.println("I can fly!"); } } public class Adventure { public static void t(CanFight x){x.fight();} public static void u(CanSwim x){x.swim();} public static void v(CanFly x){x.fly();} public
static void w(ActionCharacter x){x.fight();} public static void main(String[] args){ Hero h=new Hero(); t(h); u(h); v(h); w(h); } }

執行結果:

I can fight!
I can swim!
I can fly!
I can fight!

二、內部類

上面使用介面實現多重繼承是一種比較可行和普遍的方式,在介紹內部類的時候談到內部類使的多繼承的實現變得更加完美了,同時也明確瞭如果父類為抽象類或者具體類,那麼我就僅能通過內部類來實現多重繼承了。如何利用內部類實現多重繼承,請看下面例項:兒子是如何利用多重繼承來繼承父親和母親的優良基因。

首先是父親Father和母親Mother:

public class Father {
    public int strong(){
        return 9;
    }
}

public class Mother {
    public int kind(){
        return 8;
    }
}

重頭戲在這裡,兒子類Son:

public class Son {

    /**
     * 內部類繼承Father類
     */
    class Father_1 extends Father{
        public int strong(){
            return super.strong() + 1;
        }
    }

    class Mother_1 extends  Mother{
        public int kind(){
            return super.kind() - 2;
        }
    }

    public int getStrong(){
        return new Father_1().strong();
    }

    public int getKind(){
        return new Mother_1().kind();
    }
}

測試程式:

public class Test1 {

    public static void main(String[] args) {
        Son son = new Son();
        System.out.println("Son 的Strong:" + son.getStrong());
        System.out.println("Son 的kind:" + son.getKind());
    }

}

Output:
Son 的Strong:10
Son 的kind:6

兒子繼承了父親,變得比父親更加強壯,同時也繼承了母親,只不過溫柔指數下降了。這裡定義了兩個內部類,他們分別繼承父親Father類、母親類Mother類,且都可以非常自然地獲取各自父類的行為,這是內部類一個重要的特性:內部類可以繼承一個與外部類無關的類,保證了內部類的獨立性,正是基於這一點,多重繼承才會成為可能。