日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Java學(xué)習(xí)——37、類的多態(tài)(二)

 pythonjava學(xué)習(xí) 2021-04-06

類型的多態(tài)主要體現(xiàn)在:子類是一種父類類型。

子類通過繼承擴(kuò)充和發(fā)展了它的父類,子類是父類的一種特殊類型。

1、子類對象即是父類對象

子類對象包含了父類的所有成員,包括成員變量和成員方法,所以子類對象也是父類對象。

反之不然。

父類對象不是子類對象。

可以用關(guān)鍵字instanceof來判斷一個實(shí)例是否屬于某個類。

例:

簡單起見,本例中的類沒有任何成員。

class Person{

}

public class Student extends Person{

    public static void main(String args[]){

        Person p=new Person();

        Student s=new Student();

        System.out.println(s instanceof Person);

        System.out.println(p instanceof Student);

    }  

}

其運(yùn)行結(jié)果如下:

true

false

因?yàn)?/span>pPerson的對象,sStudent的對象,而Student類繼承自Person類。故s也是Person的實(shí)例,而p卻不是Student的實(shí)例。

2、父類對象引用子類實(shí)例

子類對象也是父類對象,說明父類對象可以引用子類實(shí)例。但反過來不行。

例:

class Person{

    private String name;

    public Person(){

        this.name="張熹熹";

    }

    public void show(){

        System.out.println("姓名:"+name);

    }

}

public class Student extends Person{

    private String number;

    public Student(){

        number="123";//默認(rèn)調(diào)用父類的Person()

    }

    public static void main(String args[]){

        Person p=new Student();

        p.show();

        Student s=new Student();

        s.show();

    }  

}

其運(yùn)行結(jié)果為:

姓名:張熹熹

姓名:張熹熹

main方法中,pPerson類的對象,但引用的是Student類的實(shí)例。SStudent類的對象,引用的也是Student類的實(shí)例。

3、編譯時多態(tài)和運(yùn)行時多態(tài)

根據(jù)何時能確定到底執(zhí)行的是多態(tài)中的哪一個方法,分為兩種情況:編譯時多態(tài)和運(yùn)行時多態(tài)。

如果在編譯時能夠確定執(zhí)行多態(tài)方法中的哪一下,就稱為編譯時多態(tài)。

否則,稱為運(yùn)行時多態(tài)。

方法的重載屬于編譯時多態(tài),因?yàn)樵诰幾g時,Java虛擬機(jī)已經(jīng)能夠根據(jù)參數(shù)類型和參數(shù)個數(shù)來匹配到底用的是哪一個重載的方法。

方法覆蓋有兩種多態(tài)性,如果創(chuàng)建的對象與引用的實(shí)例為同一個類,為編譯時多態(tài),如下:

Student s=new Student();

此時如果有s.show();在編譯時Java虛擬機(jī)就可以判定此show()方法為Student這個類的,如果Student中沒有這個方法,則沿著繼承的順序往上查找。

    但如果創(chuàng)建的對象與引用的實(shí)例不為同一個類,為運(yùn)行時多態(tài)。

例:Person p=new Student();

p為Person類的對象,但引用的卻是Student類的實(shí)例。

若此時調(diào)用p.show(),那么這個show()方法是在Student類中的show()方法呢,還是Person類中的show()方法呢?這就是運(yùn)行時的多態(tài)。

程序運(yùn)行時,Java從實(shí)例所屬的類開始尋找匹配的方法執(zhí)行,如果當(dāng)前類中沒有匹配方法,則沿著繼承關(guān)系逐層向上,依次在父類或各祖先類中尋找匹配方法,直到Object類。

故上面代碼

Person p=newStudent();

p.show();//從實(shí)例所在的類Student開始尋找,如果Student類中有方法show(),則執(zhí)行;否則,沿著繼承關(guān)系向上,在Student類的父類Person中找,如果Person類中有方法show(),則執(zhí)行;否則,沿著繼承關(guān)系繼續(xù)向上,直到Object類為止。

4、多態(tài)的方法實(shí)現(xiàn)

以下例說明:

class Person{

    private String name;

    public Person(){

        this.name="張熹熹";

    }

    public String toString(){

        return"姓名:"+name;

    }

}

public class Student extends Person{

    private String number;

    public Student(){

        number="123";//默認(rèn)調(diào)用父類的Person()

    }

    public String toString(){

        super.toString();

        return"學(xué)號:"+number;

    }

    public static void main(String args[]) {

        Person p=new Person();

        System.out.println(p.toString());//編譯時多態(tài),因?yàn)?/span>pPerson類對象,引用的也是Person類的實(shí)例,故在編譯時便知是person類中的toString()方法

        Persons=new Student();//父類對象引用子類實(shí)例

        System.out.println(p.toString());//運(yùn)行時多態(tài),sPerson類對象,但引用的是Student類的實(shí)例,在運(yùn)行時,著先在實(shí)例所在的類Student中找toString()方法,有,即執(zhí)行。

    }

}

其運(yùn)行結(jié)果如下:

姓名:張熹熹

姓名:張熹熹

    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多