1. 程式人生 > >JAVA學習筆記之-封裝,繼承,多型 總結

JAVA學習筆記之-封裝,繼承,多型 總結

-----------android培訓、java培訓、java學習型技術部落格、期待與您交流!------------ 

1、封裝

封裝:把客觀事物封裝成抽象的類,並且類可以把自己的資料和方法只讓可信的類或者物件操作,對不可信的進行資訊隱藏。是軟體設計模組化、軟體複用和軟體維護的一個基礎。

屬性的封裝:java中類的屬性的訪問許可權的預設值不是private,要想隱藏該屬性,需加private(私有)修飾符,來限制只能夠在類的內部進行訪問。對於類中的私有屬性,必須對其給出一對方法(getXxx(),setXxx())訪問私有屬性,保證對私有屬性的操作的安全性。

方法的封裝:對於方法的封裝,對外部可呼叫的方法宣告為public,而對外隱藏的資料操作則需要宣告為private,封裝會使方法實現的改變對架構的影響最小化。

完全的封裝,類的屬性全部私有化,並且提供一對方法(getXxx(),setXxx())來訪問屬性。


2、繼承
繼承,是對有著共同特性的多類事物,進行再抽象成一個類。這個類就是多類事物的父類。父類的意義在於抽取多類事物的共性。


java中的繼承要使用extends關鍵字,並且java中只允許單繼承,也就是一個類只能有一個父類。是繼承關係呈樹狀,體現了java的簡單性。


子類只能繼承在父類中可以訪問的屬性和方法(實際上父類中私有的屬性和方法也會被繼承但子類中無法訪問而已)。


訪問控制修飾符:(可以修飾屬性和方法)
private修飾符,表示只有本類內部可以訪問。
default修飾符,方法不加修飾符,會預設為default,表示在同一個包中可以訪問,父子類在同一包中,子類可以繼承父類的相應內容。(可以修飾類)
protected(保護)修飾符,表示同一包中可以訪問,不同包的子類也可以訪問繼承。
public修飾符,表示公開,在任何地方都可以訪問。(可以修飾類)
修飾符的許可權是由上而下逐漸變寬的。


繼承的意義,在於子類可以在父類的基礎之上對父類的功能進行發展,繼承可以使系統的耦合性降低,也就是使物件間的聯絡變得鬆散,使多類物件間的聯絡可以用其父類物件代替。


注意:構造方法不能被繼承。


父類的屬性及方法的確定:要從子類的角度來看子類間的共性,當所有子類都有這個屬性時,就應當考慮是否該放在父類中,方法也是如此,方法可以被看作是物件的行為,而類的方法這時這一類物件所共有的行為,所以也應當在方法的確定時注意是不是所有的子型別中都需要有這種方法,並且會根據不同的型別的行為的方式也不同才可以覆蓋著個方法。


java中方法的覆蓋


子類中有和父類中可訪問(可繼承到子類)的同名同返回型別同參數表的方法,就會覆蓋從父類繼承來的方法。


注意:在jdk1.4以前要求方法的覆蓋時,需要方法的返回值,引數表,方法名必須嚴格相同,而在jdk1.5中方法覆蓋,子類的中覆蓋的方法的返回值可以是父類中被覆蓋的方法的返回值型別的子型別。


注意:子類的方法覆蓋父類的方法時,方法的修飾符要麼相同,要麼子類中的方法的修飾符表示的訪問許可權要寬於父類。父類中的私有方法,不能被繼承到子類,子類中相同的方法也不是 覆蓋。


覆蓋的意義:對從父類中繼承的方法的發展。


注意:父子類中有同名的屬性不叫子類覆蓋了父類的屬性,這種情況較作屬性的遮蓋(shadow)。


構造有繼承關係的物件的步驟
1).遞迴的構造父類的物件
2).分配空間
3).初始化本類例項變數(屬性)
4).呼叫本類的構造方法


注意:子類物件中其實包含著父類的物件,也就是父類物件加上子類物件,才是完整的子類物件的例項。
super關鍵字
super(),表示在子類的構造方法中呼叫父類的構造方法(通過super呼叫父類構造方法在子類構造方法中初始化父類中的屬性),super()只能出現在構造方法的第一句上。super()指明構造父類時呼叫哪一個父類的構造方法構造父類。


注意:在寫類的時候,一定要寫預設無參的構造方法,如果一個構造方法的第一句既不是this(),也不是super()時,那麼就會在這裡隱含的呼叫他的父類的無參的構造方法,即隱含的有super()。


少覆蓋原則:既子類應當儘量少的覆蓋父類方法,如果覆蓋了父類的大多數方法,那就應當考慮是否應當有繼承關係


3、多型




多型,把子類物件主觀的看作是其父型別的物件,那麼父型別就可以是很多種型別。


實現多型,有二種方式,覆蓋,過載。


覆蓋,是指子類重新定義父類的虛擬函式的做法。
java方法覆蓋:如果在子類中定義的一個方法,其名稱,返回型別和引數和父類中的某個方法的名稱,返回型別及引數簽名相匹配,那麼說子類的方法覆蓋了父類的方法
  覆蓋方法必須滿足以下約束條件:


   1).子類方法的名稱、引數簽名必須和父類方法的名稱、引數簽名一致。


  2).子類方法不能縮小父類方法的訪問許可權。例如父類的public方法子類則不能宣告成private形式的,否則不能算方法覆蓋。


   3).子類方法不能丟擲比父類方法更多的異常。子類方法丟擲的異常必須和父類方法丟擲的異常相同,或者子類方法丟擲的異常類是父類方法丟擲的異常類的子類


   4).方法覆蓋只存在於子類和父類之間(包括直接父類和間接父類),在同一個類中方法是過載,而不是覆蓋


   5).子類可以定義與父類的靜態方法同名的靜態方法,以便在子類中隱藏父類的靜態方法。這裡是隱藏而不是覆蓋的原因是,執行時Java虛擬機器把靜態方法和所宣告的類繫結,而把例項方法和所屬的例項類繫結。


   6).父類的私有方法不能被子類覆蓋。


   7).父類的抽象方法可以被子類通過以下兩種途徑覆蓋:一是子類實現父類的抽象方法;二是子類重新宣告父類的抽象方法


   8).父類的非抽象方法可以被覆蓋為抽象方法




過載,是指允許存在多個同名函式,而這些函式的引數表不同(引數個數不同或者引數型別不同)。
Java中方法過載:


   1).方法名稱相同。


   2).想法的形參不同,包括形參個數不同或者形參型別不同。


   3).若僅返回值不同不算方法過載,即過載的方法可以返回值不同。


   4).方法的修飾符可以不相同。


多型可以分為編譯時多型和執行時多型


  1.編譯時多型,主要有兩點(其實不用考慮)


   1).編譯時,Java引用型別的變數根據宣告的型別來處理。


2).Java編譯器允許在具有直接或者間接繼承關係的類之間進行型別轉換,對於向上進行型別轉換,不必使用強制型別轉換;對於向下轉型,必須進行強制型別轉換。
2.執行時多型,主要是以下3點


   1).對於一個引用型別的變數,執行時Java虛擬機器按照它們實際引用的物件來處理。


    2).在執行時,子類的物件可以轉換為父類型別,而父類的物件實際上無法轉換為子類型別。因為通俗的講,父類擁有的成員子類肯定也有,而子類擁有的成員父類不一定有。


   3).在執行時環境中,通過引用型別變數來訪問所引用物件的方法和屬性時,Java虛擬機器採用以下繫結規則


    a:例項方法與引用變數實際引用的物件的方法繫結,這種繫結屬於動態繫結,因為是在執行時由Java虛擬機器動態決定的


    b:靜態方法與引用變數所宣告的型別的方法繫結,這種繫結屬於靜態繫結,因為實際上在編譯階段就已經作了繫結。


    c:成員變數(包括靜態變數和例項變數)與引用變數所實際宣告的型別的成員變數繫結,這種繫結屬於靜態繫結,因為實際上在編譯階段就已經作了繫結。




多型三特性
1).物件例項確定則不可改變(客觀不可改變)
2).只能呼叫編譯時型別所定義的方法。
3).執行時會根據執行時型別去呼叫相應型別中定義的方法。
多型的意義:在需要使用一類物件的共性時,可以用多型來遮蔽掉其子類中的差異。


注意:類的屬性是沒有多型的,只會根據編譯時型別訪問。只有子類覆蓋了父類的方法。要注意區分子類中的方法過載。對於方法的過載,則是會使用編譯時型別來進行相應的方法呼叫。


多型可以使程式碼變得更通用,以適應需求的變化。也就是定義在父類中的方法,可以在子類中有不同的實現將其覆蓋,在為父型別的物件變數賦值相應需要功能的子類的物件例項。