鍍金池/ 教程/ Java/ Java 提高篇(九)—–實(shí)現(xiàn)多重繼承
Java 集合細(xì)節(jié)(四):保持 compareTo 和 equals 同步
Iterator
使用序列化實(shí)現(xiàn)對(duì)象的拷貝
fail-fast 機(jī)制
關(guān)鍵字 final
Vector
HashTable
Java 集合細(xì)節(jié)(一):請(qǐng)為集合指定初始容量
強(qiáng)制類型轉(zhuǎn)換
數(shù)組之一:認(rèn)識(shí) JAVA 數(shù)組
Java 集合細(xì)節(jié)(三):subList 的缺陷
hashCode
ArrayList
數(shù)組之二
List 總結(jié)
LinkedList
Java 提高篇(九)—–實(shí)現(xiàn)多重繼承
Java 的四舍五入
關(guān)鍵字 static
理解 Java 的三大特性之多態(tài)
抽象類與接口
集合大家族
異常(二)
Java 集合細(xì)節(jié)(二):asList 的缺陷
Map 總結(jié)
TreeSet
equals() 方法總結(jié)
Java 提高篇(十)—–詳解匿名內(nèi)部類
HashMap
Stack
詳解內(nèi)部類
TreeMap
異常(一)
詳解 Java 定時(shí)任務(wù)
HashSet
字符串
理解 Java 的三大特性之繼承
理解 Java 的三大特性之封裝
代碼塊

Java 提高篇(九)—–實(shí)現(xiàn)多重繼承

多重繼承指的是一個(gè)類可以同時(shí)從多于一個(gè)的父類那里繼承行為和特征,然而我們知道 Java 為了保證數(shù)據(jù)安全,它只允許單繼承。有些時(shí)候我們會(huì)認(rèn)為如果系統(tǒng)中需要使用多重繼承往往都是糟糕的設(shè)計(jì),這個(gè)時(shí)候我們往往需要思考的不是怎么使用多重繼承,而是您的設(shè)計(jì)是否存在問題.但有時(shí)候我們確實(shí)是需要實(shí)現(xiàn)多重繼承,而且現(xiàn)實(shí)生活中也真正地存在這樣的情況,比如遺傳:我們即繼承了父親的行為和特征也繼承了母親的行為和特征??尚业氖?Java 是非常和善和理解我們的,它提供了兩種方式讓我們曲折來實(shí)現(xiàn)多重繼承:接口和內(nèi)部類。

一、 接口

在介紹接口和抽象類的時(shí)候了解到子類只能繼承一個(gè)父類,也就是說只能存在單一繼承,但是卻可以實(shí)現(xiàn)多個(gè)接口,這就為我們實(shí)現(xiàn)多重繼承做了鋪墊。

對(duì)于接口而已,有時(shí)候它所表現(xiàn)的不僅僅只是一個(gè)更純粹的抽象類,接口是沒有任何具體實(shí)現(xiàn)的,也就是說,沒有任何與接口相關(guān)的存儲(chǔ),因此也就無法阻止多個(gè)接口的組合了。


    interface CanFight {
        void fight();
    }

    interface CanSwim {
        void swim();
    }

    interface CanFly {
        void fly();
    }

    public class ActionCharacter {
        public void fight(){

        }
    }

    public class Hero extends ActionCharacter implements CanFight,CanFly,CanSwim{

        public void fly() {
        }

        public void swim() {
        }

        /**
         * 對(duì)于fight()方法,繼承父類的,所以不需要顯示聲明
         */
    }

二、內(nèi)部類

上面使用接口實(shí)現(xiàn)多重繼承是一種比較可行和普遍的方式,在介紹內(nèi)部類的時(shí)候談到內(nèi)部類使的多繼承的實(shí)現(xiàn)變得更加完美了,同時(shí)也明確了如果父類為抽象類或者具體類,那么我就僅能通過內(nèi)部類來實(shí)現(xiàn)多重繼承了。如何利用內(nèi)部類實(shí)現(xiàn)多重繼承,請(qǐng)看下面實(shí)例:兒子是如何利用多重繼承來繼承父親和母親的優(yōu)良基因。

首先是父親 Father 和母親 Mother:


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

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

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


    public class Son {

        /**
         * 內(nèi)部類繼承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();
        }
    }

測(cè)試程序:


    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

兒子繼承了父親,變得比父親更加強(qiáng)壯,同時(shí)也繼承了母親,只不過溫柔指數(shù)下降了。這里定義了兩個(gè)內(nèi)部類,他們分別繼承父親 Father 類、母親類 Mother 類,且都可以非常自然地獲取各自父類的行為,這是內(nèi)部類一個(gè)重要的特性:內(nèi)部類可以繼承一個(gè)與外部類無關(guān)的類,保證了內(nèi)部類的獨(dú)立性,正是基于這一點(diǎn),多重繼承才會(huì)成為可能。

有關(guān)于更多接口和內(nèi)部類的詳情,請(qǐng)參考這里:

內(nèi)部類:Java提高篇—-詳解內(nèi)部類 接口:Java提高篇—–抽象類與接口

上一篇:List 總結(jié)下一篇:數(shù)組之二