1. 程式人生 > >JavaSE面向物件的三大特徵(上)---繼承

JavaSE面向物件的三大特徵(上)---繼承

  • 面向物件的三大特徵:

1. 封裝性:所謂封裝,也就是把客觀事物封裝成抽象的類,並且類可以把自己的資料和方法只讓可信的類或 者物件操作,對不可信的進行資訊隱藏。簡而言之就是,內部操作對外部而言不可見(保護性) 。

2. 繼承性:繼承是指這樣一種能力:它可以使用現有類的所有功能,並在無需重新編寫原來的類的情況下對 這些功能進行擴充套件。

3. 多型性(*):所謂多型就是指一個類例項的相同方法在不同情形有不同表現形式。多型機制使具有不同內 部結構的物件可以共享相同的外部介面。 

  • 類與物件的定義與使用

類:指的是共性的概念,而物件是一個具體的,可以使用的事物。

首先先有類(類是生產物件的藍圖),然後才可以產生物件。物件所具有的所有行為與屬性,一定是在類中進行了完整的定義。

類中的組成:

a.方法(操作的行為)

b.屬性(操作的資料,每個物件應該具有的特徵)

範例:定義Person類

此時,方法不再由主類直接呼叫,而需要由物件呼叫。

例項化Person類物件:

此時,就可以通過物件呼叫Person類中的方法。

例項化物件應該注意,只要出現了new關鍵字,就開闢了記憶體。

  • 物件記憶體分析

我們可以簡單的將java中的記憶體區域分為棧記憶體堆記憶體兩塊區域(實際Java記憶體區域的劃分遠比這個複雜)

1. 棧記憶體(虛擬機器區域性變量表):存放的是區域性變數(包含編譯期可知的各種基本資料型別、物件引用-即堆 記憶體的地址,可以簡單的理解為物件的名稱),Java棧是與執行緒對應起來的,每當建立一個執行緒,JVM就會 為這個執行緒建立一個對應的Java棧。

2. 堆記憶體:儲存的是真正的資料。即物件的屬性資訊。

分析如下程式碼:

上面已經講過了,只要出現了關鍵詞new,表明在堆上分配了記憶體並且產生了Person類的物件per引用這部分記憶體

記憶體圖如下:

通過per引用設定堆中屬性值,記憶體圖如下:

物件(引用資料型別)必須在例項化後呼叫,否則會出現NullPointerException(執行時異常)。如若出現此類異常,根據出錯位置檢視引用型別變數是否初始化。

  • private實現封裝處理

讓內部操作對外部不可見(在類的外部不能直接使用物件來操控屬性),可以用private對屬性進行封裝,稱為類的私有屬性

封裝上述Person類中的屬性:

JAVA規範:所有私有屬性要想訪問與設定內容,提供對應的getter與setter方法。

getter方法:取得屬性內容。

setter方法:進行屬性內容的設定與更改。

類的設計原則:

a.類中的所有屬性必須使用private封裝。

b.屬性若要被外部訪問,必須定義相應的getter與setter方法。

  • 構造方法

所謂的構造方法就是使用關鍵字new例項化新物件時來進行呼叫的操作方法。

對於構造方 法的定義,也需要遵循以下原則

1. 方法名稱必須與類名稱相同

2. 構造方法沒有返回值型別宣告

3. 每一個類中一定至少存在一個構造方法(沒有明確定義,則系統自動生成一個無參構造)

注意:構造方法方法名和類名一致,沒有返回值型別  !!!!

可以使用構造方法初始化物件,避免多次呼叫setter( )方法。

構造方法的過載:引數型別或個數不同

建議:若干構造方法,按照引數個數升序或降序。

  • this關鍵字

a.this呼叫本類屬性

this.屬性名   明確表示呼叫類中同名屬性

分析以下程式碼:

通過以上程式碼我們發現,當引數與類中屬性同名時,類中屬性無法被正確賦值(就近原則)。

此時我們加上this關鍵字便可以正 確給物件屬性賦值。

規範:在類的普通方法中訪問本類屬性,一定要加this關鍵字

b.this呼叫本類方法

呼叫普通方法:  this.方法名稱(引數)

呼叫構造方法:  this(引數)

    (1)this呼叫本類其他構造方法必須放在首行呼叫   ---編譯期語法錯誤

    (2)this呼叫構造方法不允許成環  ---編譯期語法錯誤

構造方法可以互相呼叫(在滿足上述兩個條件的基礎上)

c.this表示當前物件

同樣的方法,呼叫物件不同,輸出結果也不同,this代表的是當前的物件。

  • static關鍵字(!!!)可以修飾屬性和方法。

static修飾屬性(內部屬性)

描述共享屬性,只需在屬性前新增static關鍵字即可 。

static屬性又稱為類屬性,儲存在全域性資料區的記憶體之中,所有物件都可以進行該資料區的訪問。

此時,如果我們修改了country屬性值,則Person類所有的物件的country屬性都被改變

結論:

1.訪問static屬性(類屬性)應使用類名稱.屬性名

2.所有的非static屬性(例項變數)必須在物件例項化後使用,而static屬性(類屬性)不受物件例項化控制

static修飾方法(類方法)   使用static定義的方法,直接通過類名稱訪問。

關於static方法有以下兩點說明:

1. 所有的static方法不允許呼叫非static定義的屬性或方法 (因為被static修飾的方法與物件無關,直接通過類名呼叫,而非static修飾的屬性或方法與物件強相關)。

2. 所有的非static方法允許訪問static方法或屬性。 使用static定義方法只有一個目的:某些方法不希望受到類的控制,即可以在沒有例項化物件的時候執行。