您好,登錄后才能下訂單哦!
------- 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è),即1或2個(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()); } }
免責(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)容。