本篇內(nèi)容主要講解“Java多態(tài)性怎么理解”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Java多態(tài)性怎么理解”吧!
創(chuàng)新互聯(lián)是一家專(zhuān)注于網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作與策劃設(shè)計(jì),成都網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專(zhuān)注于網(wǎng)站建設(shè)十余年,網(wǎng)設(shè)計(jì)領(lǐng)域的專(zhuān)業(yè)建站公司;建站業(yè)務(wù)涵蓋:成都等地區(qū)。成都做網(wǎng)站價(jià)格咨詢(xún):028-86922220
面向?qū)ο缶幊逃腥齻€(gè)特征,即封裝、繼承和多態(tài)。
封裝隱藏了類(lèi)的內(nèi)部實(shí)現(xiàn)機(jī)制,從而可以在不影響使用者的前提下改變類(lèi)的內(nèi)部結(jié)構(gòu),同時(shí)保護(hù)了數(shù)據(jù)。
繼承是為了重用父類(lèi)代碼,同時(shí)為實(shí)現(xiàn)多態(tài)性作準(zhǔn)備。那么什么是多態(tài)呢?
方法的重寫(xiě)、重載與動(dòng)態(tài)連接構(gòu)成多態(tài)性。Java之所以引入多態(tài)的概念,原因之一是它在類(lèi)的繼承問(wèn)題上和C++不同,后者允許多繼承,這確實(shí)給其帶來(lái)的非常強(qiáng)大的功能,但是復(fù)雜的繼承關(guān)系也給C++開(kāi)發(fā)者帶來(lái)了更大的麻煩,為了規(guī)避風(fēng)險(xiǎn),Java只允許單繼承,派生類(lèi)與基類(lèi)間有IS-A的關(guān)系(即“貓”is a “動(dòng)物”)。
這樣做雖然保證了繼承關(guān)系的簡(jiǎn)單明了,但是勢(shì)必在功能上有很大的限制,所以,Java引入了多態(tài)性的概念以彌補(bǔ)這點(diǎn)的不足,此外,抽象類(lèi)和接口也是解決單繼承規(guī)定限制的重要手段。同時(shí),多態(tài)也是面向?qū)ο缶幊痰木杷凇?/p>
要理解多態(tài)性,首先要知道什么是“向上轉(zhuǎn)型”。
我定義了一個(gè)子類(lèi)Cat,它繼承了Animal類(lèi),那么后者就是前者是父類(lèi)。我可以通過(guò)
Cat c = new Cat();
實(shí)例化一個(gè)Cat的對(duì)象,這個(gè)不難理解。但當(dāng)我這樣定義時(shí):
Animal a = new Cat();
這代表什么意思呢?
很簡(jiǎn)單,它表示我定義了一個(gè)Animal類(lèi)型的引用,指向新建的Cat類(lèi)型的對(duì)象。由于Cat是繼承自它的父類(lèi)Animal,所以Animal類(lèi)型的引用是可以指向Cat類(lèi)型的對(duì)象的。那么這樣做有什么意義呢?因?yàn)樽宇?lèi)是對(duì)父類(lèi)的一個(gè)改進(jìn)和擴(kuò)充,所以一般子類(lèi)在功能上較父類(lèi)更強(qiáng)大,屬性較父類(lèi)更獨(dú)特,
定義一個(gè)父類(lèi)類(lèi)型的引用指向一個(gè)子類(lèi)的對(duì)象既可以使用子類(lèi)強(qiáng)大的功能,又可以抽取父類(lèi)的共性。所以,父類(lèi)類(lèi)型的引用可以調(diào)用父類(lèi)中定義的所有屬性和方法,而對(duì)于子類(lèi)中定義而父類(lèi)中沒(méi)有的方法,它是無(wú)可奈何的;同時(shí),父類(lèi)中的一個(gè)方法只有在在父類(lèi)中定義而在子類(lèi)中沒(méi)有重寫(xiě)的情況下,才可以被父類(lèi)類(lèi)型的引用調(diào)用;對(duì)于父類(lèi)中定義的方法,如果子類(lèi)中重寫(xiě)了該方法,那么父類(lèi)類(lèi)型的引用將會(huì)調(diào)用子類(lèi)中的這個(gè)方法,這就是動(dòng)態(tài)連接。
看下面這段程序:
class Father{ public void func1(){ func2(); } //這是父類(lèi)中的func2()方法,因?yàn)橄旅娴淖宇?lèi)中重寫(xiě)了該方法 //所以在父類(lèi)類(lèi)型的引用中調(diào)用時(shí),這個(gè)方法將不再有效 //取而代之的是將調(diào)用子類(lèi)中重寫(xiě)的func2()方法 public void func2(){ System.out.println("AAA"); } } class Child extends Father{ //func1(int i)是對(duì)func1()方法的一個(gè)重載 //由于在父類(lèi)中沒(méi)有定義這個(gè)方法,所以它不能被父類(lèi)類(lèi)型的引用調(diào)用 //所以在下面的main方法中child.func1(68)是不對(duì)的 public void func1(int i){ System.out.println("BBB"); } //func2()重寫(xiě)了父類(lèi)Father中的func2()方法 //如果父類(lèi)類(lèi)型的引用中調(diào)用了func2()方法,那么必然是子類(lèi)中重寫(xiě)的這個(gè)方法 public void func2(){ System.out.println("CCC"); } } public class PolymorphismTest { public static void main(String[] args) { Father child = new Child(); child.func1();//打印結(jié)果將會(huì)是什么? } }
上面的程序是個(gè)很典型的多態(tài)的例子。子類(lèi)Child繼承了父類(lèi)Father,并重載了父類(lèi)的func1()方法,重寫(xiě)了父類(lèi)的func2()方法。重載后的func1(int i)和func1()不再是同一個(gè)方法,由于父類(lèi)中沒(méi)有func1(int i),那么,父類(lèi)類(lèi)型的引用child就不能調(diào)用func1(int i)方法。而子類(lèi)重寫(xiě)了func2()方法,那么父類(lèi)類(lèi)型的引用child在調(diào)用該方法時(shí)將會(huì)調(diào)用子類(lèi)中重寫(xiě)的func2()。
那么該程序?qū)?huì)打印出什么樣的結(jié)果呢?
很顯然,應(yīng)該是“CCC”。
對(duì)于多態(tài),可以總結(jié)它為:
一、使用父類(lèi)類(lèi)型的引用指向子類(lèi)的對(duì)象;
二、該引用只能調(diào)用父類(lèi)中定義的方法和變量;
三、如果子類(lèi)中重寫(xiě)了父類(lèi)中的一個(gè)方法,那么在調(diào)用這個(gè)方法的時(shí)候,將會(huì)調(diào)用子類(lèi)中的這個(gè)方法;(動(dòng)態(tài)連接、動(dòng)態(tài)調(diào)用)
四、變量不能被重寫(xiě)(覆蓋),”重寫(xiě)“的概念只針對(duì)方法,如果在子類(lèi)中”重寫(xiě)“了父類(lèi)中的變量,那么在編譯時(shí)會(huì)報(bào)錯(cuò)。
到此,相信大家對(duì)“Java多態(tài)性怎么理解”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢(xún),關(guān)注我們,繼續(xù)學(xué)習(xí)!
當(dāng)前文章:Java多態(tài)性怎么理解
當(dāng)前路徑:http://aaarwkj.com/article18/jjhgdp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、、網(wǎng)頁(yè)設(shè)計(jì)公司、標(biāo)簽優(yōu)化、網(wǎng)站策劃、定制網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)