第5章面向對象(上)

第5章 面向對象(上)

類可以被認爲是自定義的數據類型,可以使用類來定義變量,所有使用類定義的變量都是引用對象

 

類用於描述客觀世界裏某一類對象的共同特徵,而對象則是類的具體存在

5.1類和對象

java程序使用類的構造器來創建該類的對象

 

繼承是實現類的複用的重要手段 組合也可以實現類的複用

 

static 的真正作用是用於區分 變量 方法 內部類 初始化塊 這四種成員到底是屬於類本身還是屬於實例

 

類的構造器是有返回值的 當使用new 關鍵字來調用構造器時 構造器返回該類的實例,因此構造器的返回值類型總是當前類

 

類的作用

1.定義變量

2.創建對象

3.調用類方法或者類變量

 

創建對象的根本途徑是構造器

 

java對象的大致作用是

1. 訪問對象的實例變量

2. 調用對象的方法

 

定義一個類就是爲了重複創建一個類的實例,同一個類的實例具有相同的特徵,而類定義了多個實例的共同特徵

 

java裏的引用就是C裏的指針,只是java將他封裝起來了 ,所有java 不允許直接訪問堆內存中的對象,只能通過對象的引用來操作該對象

5.1.4對象的this引用

this 關鍵字總是指向調用該方法的對象,根據this 出現位置的不同 this作爲對象的默認引用有兩種情況

1. 構造器中引用該構造器正在初始化的對象

2. 在方法中引用該方法的對象

 

this可以代表任何對象,當this出現在某一個方法體中時,它所代表的對象是不確定的,但是它的類型是確定的,它所代表的只能是當前類的類型 只有當這個方法被調用時,它所代表的對象才能被確定下來

誰在調用這個方法 this就代表誰

 

this不可以修飾static修飾的方法

 

大部分時候成員變量無需使用this 假如一個方法有一個局部變量和成員變量同名的時候,但程序又需要訪問該放過被覆蓋的變量時 則必須使用 this

 

5.2 方法

java裏方法傳遞參數的方法只有  值傳遞 將實際值的副本 傳入方法內 而參數本身不會有任何變化

 

5.2.3 參數個數可變

jdk 1.5 以後 允許爲方法指定數量不確定的形參 (最後一個形參 類型後面加 ... )表示可以接收多個參數值

本質 是一個數組參數

 

傳給形參的實參值無需是一個數組 ,飯如果採用數組形參來聲明方法,調用時,必須傳給形參一個數組

 

個數可變的形參只能處於參數的最後,一個方法中最多只能有一個可變形參

 

5.2.5 方法重載

返回值類型不能作爲區分方法重載 java在調用方法時可以忽略方法的返回值

 

5.3 成員變量和局部變量

定義成員變量時, 有static修飾的叫做類變量 沒有static修飾的叫做實例變量

 

類變量從該類準備階段就開始存在了直到這個系統完全銷燬這個類

實例變量時從該實例被創建時開始存在,直到這個系統被完全銷燬

 

一個類在使用前要經過 類的加載 類驗證 類準備 類解析 類初始化等階段

 

局部變量除了形參之外,都必須要顯示初始化,否則不可以訪問

 

當系統加載類或者創建類時 系統會自動爲成員變量分配內存空間,並自動爲成員變量指定初始值

 

 

對於局部變量來說 系統並不會爲局部變量執行初始化 只有程序爲這個變量賦值之後纔會爲之分配內存,並將初始化值保存到內存中(保存在該方法的棧內存中)

 

局部變量可以處理的問題最好不好實用成員變量

1. 增加了變量的生成空間 這個導致了更大的內存開銷

2. 擴大了變量的作用域,這個不利於提高程序的內聚性

 

下面情況 則考慮使用成員變量

1.如果需要定義的變量時用來描述某一個類對象的固有信息 (人的身高 體重)

2.如果一個類需要用一個變量來保存該類或者實例運行時的狀態信息(flag

3.某一個信息需要在多個類之間共享

 

原則 儘量縮小變量的作用範圍 包括局部變量 變量的範圍越小 則它在內存中的佔用時間也就越短  則程序的性能也就越好

 

 

5.4 隱藏和封裝

對一個類或者對象實現良好的封裝的好處

1. 隱藏類的具體實現細節

2. 讓使用者只能通過事先預定好的方法來訪問數據,從而在方法中加入邏輯判斷

3. 可進行數據檢查,從而利於保證對象信息的完整性

4. 便於修改 提高程序的可維護性

 

爲了實現良好的封裝需要考慮

1. 強對象的成員變量和實現細節都隱藏起來,不允許外部直接訪問

2. 把方法暴漏出來,讓方法來控制對這些成員變量進行安全的訪問和操作

 

模板設計追求 高內聚 低耦合

高內聚 儘可能把模塊裏的內部數據,功能實現細節都隱藏在模板內部獨立完成,不允許外部直接干預

低耦合 儘量暴漏少量的方法給外部使用

 

5.5 深入構造器

構造器是一個特殊的方法,這個特殊的方法用於創建實例時執行初始化,構造器是創建對象的重要途徑(即使 工廠模式 反射 其實都依賴構造器)

 

當構造方法重載時 最好是使用 this調用其他構造器(便於後期維護)

 

5.6類的繼承

重寫父類方法要遵循 兩同兩小一大 原則

兩同

方法名相同

參數列表相同

兩小

方法的返回值類型 和拋出的異常 要小於或等於父類

一大

指子類的方法訪問權限應該比父類的相同或者更大

 

重寫方法是要麼都是類方法要麼都是實例方法

 

 

 

當程序創建了一個子類對象後 系統不僅會爲子類的實例變量分配內存,也會從他的父類哪裏繼承得到的實例變量分配內存

 

父類的構造器總會在子類的構造器之前執行 所以最先最執行的總是Object 的構造器

 

5.7 多態

java引用變量有兩個類型 一個時編譯時類型 一個時運行時類型

編譯時類型 是由聲明該變量時使用的類型決定了

運行時類型 運行時類型是由實際賦給變量的對象決定的

如果編譯時類型和運行時類型不一樣是 就會產生所謂的多態

 

通過引用變量來訪問其包含的實例變量時,系統總是試圖訪問它編譯時所定義的成員變量(對象的實例不具備多態)

 

5.7.2引用類型的強制類型轉換

引用變量只能調用它編譯時類型的方法,而不能調用它運行時的類型的方法 ,如果需要讓這個引用變量調用運行時類型的方法就必須強制類型轉換

 

強制類型轉換時需要注意

1.基本類型之間的轉換只能在數值之間轉換

2.引用類型之間相互轉換只能在具有繼承關係的類型之間

 

 

5.8繼承和組合

繼承和組合都可以實現類的複用性 採用組合能更好的保護類的封裝性

 

儘量不要在父類的構造器中調用被子類重寫的方法

 

什麼情況下需要從父類派生出子類呢 不僅需要保證子類是一種特殊的父類,而且需要具備以下兩個條件

1. 子類需要額外增加屬性

2. 子類需要增加自己獨有的行爲方式

 

總之 繼承想表達的是 is-a  而組合想表達的是 has-a的關係

 

5.9 初始化塊

初始化塊是java類的一種成員,初始化塊只能在創建對象的隱式執行,而卻在執行構造器之前

初始化和聲明實例變量的順序是相同的 都是從上向下

 

如果有一段代碼處理對所有代碼都相同 且無需接收參數 就可以把這段代碼放到初始化塊裏

 

實際上初始化代碼塊是一個假象 在使用javac 之後 初始化代碼塊的代碼會被還原到 每一個構造器中 且位於構造器代碼的最前面

 

靜態塊是在系統將類初始化階段執行的

 

java系統加載一個類時,總是保證該類的所有父類(直接 間接)都加載完並初始化

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章