方法的覆蓋
5.2.3 方法的覆蓋
在一個(gè)子類繼承直接超類(或父類)時(shí),如果直接超類的某個(gè)成員方法對(duì)于子類而言是不合適的,那該怎么辦呢?我們可以在子類中定義一個(gè)方法,該方法與直接超類中的成員方法原型相同,即方法的返回類型、方法名、參數(shù)完全一致,從而進(jìn)行方法覆蓋。
在子類中定義了一個(gè)實(shí)例方法,該方法與直接超類中的某個(gè)實(shí)例方法具有相同的方法名、返回類型和完全一致的參數(shù),從而使直接超類中的那個(gè)方法不能被子類直接引用,這稱為方法覆蓋。
一個(gè)正確的方法覆蓋需要滿足以下要求:
(1)覆蓋方法與被覆蓋方法的返回類型、方法名、參數(shù)要完全一致;
(2)覆蓋方法的訪問級(jí)別不能低于被覆蓋方法的訪問級(jí)別;
(3)覆蓋方法不能比被覆蓋方法拋出更多的受檢查異常(checked Exception)。
【例5-4】 在例5-1中,在圓類和直接超類圓柱體類中增加同名方法,實(shí)現(xiàn)方法覆蓋。
程序運(yùn)行結(jié)果:
分析與思考:(1)方法double getArea()在Circle直接超類和Cylinder子類中,具有相同的方法名、返回類型和完全一致的參數(shù),所以是方法覆蓋。
(2)當(dāng)出現(xiàn)方法覆蓋時(shí),如果要在子類中訪問直接超類中被覆蓋的方法,可以使用包含關(guān)鍵字super的方法訪問表達(dá)式,即:
super.方法名([實(shí)參表])
例如,在本例中,在Cylinder子類中,通過super.getArea()引用Circle直接超類中被覆蓋的方法。
(3)變量隱藏和方法覆蓋的意義:在不改變變量名和方法名的基礎(chǔ)上,即對(duì)外統(tǒng)一名字和接口,通過變量隱藏和方法覆蓋可以把父類的狀態(tài)和行為改變成自身的狀態(tài)和行為,又不失其繼承性。例如,Cylinder子類中的name變量和getArea()方法,沒有改變父類的變量名和方法名,即對(duì)外統(tǒng)一以引用變量.name和引用變量.getArea()形式引用,通過變量隱藏和方法覆蓋可以把父類的狀態(tài)(name=“circle”)和行為(計(jì)算圓的面積)改變成Cylinder子類自身的狀態(tài)(name=“cylinder”)和行為(計(jì)算圓柱體的表面積),同時(shí)又繼承了父類其他非私有成員。
(4)o=obj語句執(zhí)行后,引用變量o的值指向Cylinder類的對(duì)象。因此,o.getArea()實(shí)例方法執(zhí)行的是引用變量o所指對(duì)象的計(jì)算圓柱體表面積。
(5)Cylinder子類中g(shù)etArea()方法的訪問權(quán)限從public改為其他修飾符,會(huì)出現(xiàn)編譯錯(cuò)誤。這是因?yàn)楦采w方法的訪問級(jí)別低于被覆蓋方法的訪問級(jí)別。
模仿例5-4:長(zhǎng)方體類是矩形類的子類,并在這兩個(gè)類中增加同名方法,實(shí)現(xiàn)方法覆蓋。
免責(zé)聲明:以上內(nèi)容源自網(wǎng)絡(luò),版權(quán)歸原作者所有,如有侵犯您的原創(chuàng)版權(quán)請(qǐng)告知,我們將盡快刪除相關(guān)內(nèi)容。