java中的覆蓋,重載和多態
今天來介紹java中的三大強功能覆蓋,重載和多態。
方法覆蓋:當一個子類繼承了一個父類時,它也同時繼承了父類的屬性和方法,可以直接使用父類的屬性和方法,或者,如果父類的方法不能滿足子類的需求,則可以在子類中對父類的方法進行“改造”即覆蓋。在覆蓋的過程中,需要提供和父類中的被覆蓋方法相同的方法名稱,輸入參數以及返回類型。另外,在子類對父類的方法進行覆蓋的過程中,不能使用比父類中的被覆蓋方法更嚴格的訪問權限,例如父類中方法的修飾符為public,則子類的覆蓋方法不能用protected,default或者private等來限制。
方法重載:在java程序中,如果同一個類中有兩個相同的方法(方法名相同,返回值相同,參數列表相同)是不行的,因為這樣編譯器無法將方法的調用和特定的方法聯系起來。但是,在一個類中,如果有多個方法具有相同的名稱,而有不同的參數,這種情況是允許的,稱這種行為為方法的重載。在進行方法的重載時,方法的參數列表必須不同(參數個數不同,參數數據類型不同或者兩者皆不同),而方法的返回值可以相同也可以不同。進行方法的重載時要遵守的四條基本原則:1.方法名相同。2.參數列表必須不同。3.返回值可以不同。4.可以相互調用。
多態:在java中,對象變量是多態的,一個類型為Aclass的變量既可以指向類型為Aclass的對象,又可以指向Aclass的任何子類的對象。實際上多態的作用就是消除類型之間的耦合關系。如果有一個父類,由它派生出了一個子類,那麽我們可以將子類的對象賦給父類對象,這是java中“替換原則”的體現,無論何時,只要程序需要一個父類對象,那麽就可以用一個子類的對象來替代它,這種能力也叫動態綁定。但是使用多態傳遞參數時需要註意,一個對象只能有一種確切的數據類型,如果將一個變量聲明為父類的引用類型,那麽即使它引用的對象是某個子類的對象,編譯器也只是將這個對象當作父類類型對象。因此,若一個引用類型變量聲明為父類的類型但實際引用的是子類對象,那麽該變量就不能再訪問子類中添加的屬性和方法。除了父類和子類之間的多態機制,接口和實現它的類之間也可以實現這種多態機制。
多態中的instanceof運算符:java語言中的多態機制導致了引用變量的聲明類型和其實際引用對象的類型可能不一致,為了更準確地鑒別一個對象的真正類型,java引入了instanceof操作符,使用格式為:引用類型變量 instanceof 引用類型。這是一個boolean類型的表達式,指出對象是否是特定的一個實例。
引用類型的數據轉換:各種簡單數據類型之間可以進行相互轉換,有些轉換可以系統自動完成,而有些轉換必須在程序中通過強制轉換來完成,而對於引用數據類型,也有一個相互轉換的機制。分為自定轉換和強制轉換兩種情況:將子類的實例轉換成父類的實例總是可行的,而將父類的對象轉換成子類的對象時,必須使用強制類型轉換,使用運算符“()”。需要註意的是,無論是自動轉換還是強制轉換,都只能用在有繼承關系的對象之間。父類對象與子類對象的轉化原則:1.子類對象可以被視為是其父類的一個對象。2.父類對象不能當成是其某一個子類的對象。3.如果一個方法的形式參數定義的是父類對象,那麽調用這個方法,可以使用子類對象作為形式參數。4.如果父類對象引用指向的實際上是一個子類對象,那麽這個父類對象的引用可以用強制類型轉換轉化成子類對象的引用,在轉換之前要使用instanceof運算符進行判斷。
java中的覆蓋,重載和多態