溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

黑馬程序員——面向?qū)ο笃鄳B(tài)

發(fā)布時(shí)間:2020-05-22 04:03:32 來(lái)源:網(wǎng)絡(luò) 閱讀:368 作者:optimisticpig 欄目:移動(dòng)開(kāi)發(fā)

------- android培訓(xùn)、java培訓(xùn)、期待與您交流! ----------


多態(tài)

   定義:某一類事物的多種存在形態(tài)。

   例:動(dòng)物中貓,狗。

   貓這個(gè)對(duì)象對(duì)應(yīng)的類型是貓類型

   x = new ();

   同時(shí)貓也是動(dòng)物中的一種,也可以把貓稱為動(dòng)物。

1、多態(tài)的體現(xiàn)。

   父類的引用指向了自己的子類對(duì)象。

   父類的引用也可以接受自己的子類對(duì)象。

2、多態(tài)的前提。

   必須是類與類之間有關(guān)系,要么繼承,要么實(shí)現(xiàn)。

   通常還有個(gè)前提,存在覆蓋。

3、多態(tài)的利弊。

   利處:多態(tài)的出現(xiàn)大大的提高了程序的擴(kuò)展性。

   弊端:只能使用父類的引用訪問(wèn)父類中的成員。

4、多態(tài)的應(yīng)用。

   示例代碼:

/*
需求:
電腦運(yùn)行實(shí)例,電腦運(yùn)行基于主板
*/
interface PCI
{
    public void open();
    public void close();
}
class MainBoard
{
    public void run()
    {
        System.out.println("mainboard run");
    }
    public void usePCI(PCI p)//PCI p = new NetCard();接口型引用指向自己的子類對(duì)象。
    {
        p.open();
        p.close();
    }
}
class NetCard implements PCI
{
    public void open()
    {
        System.out.println("netcard open");
    }
    public void close()
    {
        System.out.println("netcard close");
    }
}
class SoundCard implements PCI
{
    public void open()
    {
        System.out.println("soundcard open");
    }
    public void close()
    {
        System.out.println("soundcard close");
    }
}
class  DuoTaiDemo5
{
    public static void main(String[] args)
    {
        MainBoard mb = new MainBoard();
        mb.run();
        mb.usePCI(new SoundCard());
    }
}



   如果想用子類對(duì)象的特有方法,如何判斷對(duì)象是哪個(gè)具體的子類類型呢?

       可以可以通過(guò)一個(gè)關(guān)鍵字 instanceof ;判斷對(duì)象是否實(shí)現(xiàn)了指定的接口或繼承了指定的類。

       格式:對(duì)象 instanceof 類型 ,判斷一個(gè)對(duì)象是否所屬于指定的類型。

       Studentinstanceof Person = true;//student繼承了person


多態(tài)在子父類中的成員上的體現(xiàn)的特點(diǎn):

   1,成員變量:在多態(tài)中,子父類成員變量同名。

       在編譯時(shí)期:參考的是引用型變量所屬的類中是否有調(diào)用的成員。(編譯時(shí)不產(chǎn)生對(duì)象,只檢查語(yǔ)法錯(cuò)誤)

       運(yùn)行時(shí)期:也是參考引用型變量所屬的類中是否有調(diào)用的成員。

       簡(jiǎn)單一句話:無(wú)論編譯和運(yùn)行,成員變量參考的都是引用變量所屬的類中的成員變量。

       再說(shuō)的更容易記憶一些:成員變量 --- 編譯運(yùn)行都看 = 左邊。

   2,成員函數(shù)。

       編譯時(shí)期:參考引用型變量所屬的類中是否有調(diào)用的方法。

       運(yùn)行事情:參考的是對(duì)象所屬的類中是否有調(diào)用的方法。

       為什么是這樣的呢?因?yàn)樵谧痈割愔?,?duì)于一模一樣的成員函數(shù),有一個(gè)特性:覆蓋。

       簡(jiǎn)單一句:成員函數(shù),編譯看引用型變量所屬的類,運(yùn)行看對(duì)象所屬的類。

       更簡(jiǎn)單:成員函數(shù) --- 編譯看 = 左邊,運(yùn)行看 = 右邊。

   3,靜態(tài)函數(shù)。

       編譯時(shí)期:參考的是引用型變量所屬的類中是否有調(diào)用的成員。

       運(yùn)行時(shí)期:也是參考引用型變量所屬的類中是否有調(diào)用的成員。

       為什么是這樣的呢?因?yàn)殪o態(tài)方法,其實(shí)不所屬于對(duì)象,而是所屬于該方法所在的類。

       調(diào)用靜態(tài)的方法引用是哪個(gè)類的引用調(diào)用的就是哪個(gè)類中的靜態(tài)方法。

       簡(jiǎn)單說(shuō):靜態(tài)函數(shù) --- 編譯運(yùn)行都看 = 左邊。


Objiec

   equals方法,toString方法

   示例:

/*object:是所有對(duì)象的直接或者間接父類,傳說(shuō)中的上帝。
該類中定義的肯定是所有對(duì)象都具備的功能。
如果自定義類中也有比較相同的功能,沒(méi)有必要重新定義。
只要沿襲父類中的功能呢,建立自己特有的比較內(nèi)容即可。這就是覆蓋。
*/
class Demo
{
    private int num;
    Demo(int num)
    {
        this.num = num;
    }
    public boolean equals(Object obj)//復(fù)寫(xiě)object中方法
    {
        if (obj instanceof Demo)
        {
            return false;
        }
        Demo d = (Demo)obj;
        return this.num ==d.num;
    }
    public String toString()//復(fù)寫(xiě)object中方法
    {
        return "Demo:"+num
    }
}
class ObjectDemo
{
    public static void main(String[] args)
    {
        Demo d1 = new Demo(4);
        //Demo d2 = new Demo(5);
        //System.out.println(d1.equals(d2));
        //d1.getClass().getName();獲取d1的class對(duì)象,并調(diào)用getName方法。
        System.out.println(d1.getClass().getName()+"@"+Integer.toHexString(d1.hashCode()));
        System.out.println(d1.toString());
                                                                                                                                       
    }
}


內(nèi)部類

   內(nèi)部類訪問(wèn)規(guī)則

       1,內(nèi)部類可以直接訪問(wèn)外部類中的成員,包括私有。

       之所以可以直接訪問(wèn)外部類中的成員,是因?yàn)橥獠款愔谐钟辛艘粋€(gè)外部類的引用。格式是:外部類名.this

       2,外部類要訪問(wèn)內(nèi)部類,必須建立內(nèi)部類對(duì)象。


   訪問(wèn)格式

       1,當(dāng)內(nèi)部類定義在外部類的成員位置上,而且非私有,可以在外部其他類中直接建立內(nèi)部類對(duì)象。

           格式:外部類名.內(nèi)部類名變量名 = 外部類對(duì)象.內(nèi)部類對(duì)象;

                 Outer.Inner in = new Outer().Inner();

       2,當(dāng)內(nèi)部類在成員位置上,就可以被成員修飾符所修飾。

           比如:private:將內(nèi)部類在外部類中進(jìn)行封裝。

           static:內(nèi)部類就具備static的特性。

           當(dāng)內(nèi)部類被static修飾后,只能直接訪問(wèn)外部類中的static成員,出現(xiàn)訪問(wèn)局限。

           在外部其他類中,如何直接訪問(wèn)static內(nèi)部類的非靜態(tài)成員呢?new Outer.Inner().function();

           在外部其他類中,如何直接訪問(wèn)static內(nèi)部類的靜態(tài)成員呢?Outer.Inner.function();

       注意:當(dāng)內(nèi)部類中定義了靜態(tài)成員,該內(nèi)部類必須是static的。

           當(dāng)外部類中的靜態(tài)方法訪問(wèn)內(nèi)部類時(shí),內(nèi)部類必須是靜態(tài)的。

3,內(nèi)部類定義在局部時(shí):

   1,不可以被成員修飾符修飾。

   2,可以直接訪問(wèn)外部類中的成員,因?yàn)檫€持有外部類中的引用。但是不可以訪問(wèn)他所在的局部中的變量,只能訪問(wèn)被final修飾的局部變量。

   內(nèi)部類的使用:

       當(dāng)描述事物,事物中的內(nèi)部還有事物,該事物用內(nèi)部類來(lái)描述。

       因?yàn)閮?nèi)部事物在使用外部事物的內(nèi)容。

       內(nèi)部類編譯后的文件名為:“外部類名$內(nèi)部類名.java”;


匿名內(nèi)部類:

   1,匿名內(nèi)部類其實(shí)就是內(nèi)部類的簡(jiǎn)寫(xiě)格式。

   2,定義匿名內(nèi)部類的前提:內(nèi)部類必須是繼承一個(gè)類或者實(shí)現(xiàn)接口。

   3,匿名內(nèi)部類的格式:new 父類或者接口(可傳參數(shù)){定義子類的內(nèi)容}

   4,其實(shí)匿名內(nèi)部類就是一個(gè)匿名子類對(duì)象。而且這個(gè)對(duì)象有點(diǎn)胖??梢岳斫鉃閹?nèi)容的對(duì)象。

   5,匿名內(nèi)部類中定義的方法最好不要超過(guò)2個(gè),即12個(gè)。

示例代碼:

/*object:是所有對(duì)象的直接或者間接父類,傳說(shuō)中的上帝。
該類中定義的肯定是所有對(duì)象都具備的功能。
如果自定義類中也有比較相同的功能,沒(méi)有必要重新定義。
只要沿襲父類中的功能呢,建立自己特有的比較內(nèi)容即可。這就是覆蓋。
*/
class Demo
{
    private int num;
    Demo(int num)
    {
        this.num = num;
    }
    public boolean equals(Object obj)//復(fù)寫(xiě)object中方法
    {
        if (obj instanceof Demo)
        {
            return false;
        }
        Demo d = (Demo)obj;
        return this.num ==d.num;
    }
    public String toString()//復(fù)寫(xiě)object中方法
    {
        return "Demo:"+num
    }
}
class ObjectDemo
{
    public static void main(String[] args)
    {
        Demo d1 = new Demo(4);
        //Demo d2 = new Demo(5);
        //System.out.println(d1.equals(d2));
        //d1.getClass().getName();獲取d1的class對(duì)象,并調(diào)用getName方法。
        System.out.println(d1.getClass().getName()+"@"+Integer.toHexString(d1.hashCode()));
        System.out.println(d1.toString());
          
    }
}




向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI