Java三大特性之多態

轉載請標明出處:http://blog.csdn.net/wu_wxc/article/details/51463306
本文出自【吳孝城的CSDN博客】

一個行爲具有多種表現形式稱爲多態
如吹奏樂器,吹笛子和吹簫聲音是不同的,同樣是吹這個動作,作用在不同對象上產生不同的效果,這就是多態。吹這個動作的多態。

Java的引用變量有兩個類型,編譯時類型和運行時類型。
編譯時類型由聲明該變量時使用的類型決定,運行時類型由實際賦給該變量的類型決定,如果編輯時類型和運行時類型不一致,就可能出現多態。

多態的體現
方法的重載和重寫
對象的多態性

如類A,類B
其中

B extends A

那麼向上轉型

A a = new B();

可以通過a調用父類方法,如果父類方法被重寫,將調用重寫後的方法

向下轉型要先向上轉型,再向下轉型

A a = new B();
B b = (B)a;

可以通過b調用子類的方法,父類的方法,(因爲子類繼承父類,享有父類方法)

引用類型轉換
1、向上類型轉換(隱式/自動類型轉換),由小類型轉向大類型
2、向下類型轉換(強制類型轉換),由大類型轉向小類型
3、instanceof運算符,用來解決類型轉換的安全性問題

例子

package cn.wuxiaocheng;

class A {
    public void priA1() {
        System.out.println("priA1");
    }

    public void priA2() {
        System.err.println("priA2");
    }
}

class B extends A {
    // 重寫父類的priA1()方法
    public void priA1() {
        System.out.println("重寫priA1");
    }
    public void priB() {
        System.out.println("priB");
    }
}

public class Test {

    public static void main(String[] args) {
        // 向上轉型
        A a = new B();
        a.priA1();
        a.priA2();

    }

}

這裏寫圖片描述

package cn.wuxiaocheng;

class A {
    public void priA1() {
        System.out.println("priA1");
    }

    public void priA2() {
        System.err.println("priA2");
    }
}

class B extends A {
    // 重寫父類的priA1()方法
    public void priA1() {
        System.out.println("重寫priA1");
    }
    public void priB() {
        System.out.println("priB");
    }
}

public class Test {

    public static void main(String[] args) {

        // 向下轉型要先向上轉型,再向下轉型
        A a2 = new B();
        B b = (B)a2;
        b.priA1();
        b.priA2();
        b.priB();

    }

}

這裏寫圖片描述

當在進行類型轉換時,如果類型不匹配時會出現異常,可以用instanceof來用避免類型轉換時的安全性問題

package cn.wuxiaocheng;

class A {
    public void priA1() {
        System.out.println("priA1");
    }

    public void priA2() {
        System.err.println("priA2");
    }
}

class B extends A {
    // 重寫父類的priA1()方法
    public void priA1() {
        System.out.println("重寫priA1");
    }
    public void priB() {
        System.out.println("priB");
    }
}

public class Test {

    public static void main(String[] args) {

        A a1 = new A();
        System.out.println(a1 instanceof A);
        System.out.println(a1 instanceof B);

        A a2 = new B();
        System.out.println(a2 instanceof A);
        System.out.println(a2 instanceof B);
    }
}

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章