1.物件導向的三大特徵
其中繼承和多型放在後面講,今天只聊封裝
.
2.封裝的介紹
舉例
如果要我們處理一堆學生的資料,我們可以直接設計一個類,將我們需要處理的資料封裝到類當中變為成員變數,然後我們直接建立兩個物件,再將資料封裝到物件中即可
.
3.封裝的好處
1.便於我們維護資料。例如剛才處理學生資料,如果直接定義一大包變數十分臃腫
2.方便使用者使用。使用者無需關心內部實現,只要知道如何使用就行
.
舉例:如同一輛車,使用者完全不需要知道汽車內部如何構建運作,使用者只需要知道怎麼開車就行
.
4.封裝的設計規範
依舊拿汽車舉例,商家會把引擎,發動機給使用者看嗎,商家只會把拉桿,方向盤暴露出給使用者,而其他沒必要的東西都會用殼子包裹隱藏,這就是合理隱藏,合理暴露
.
舉例:
如上圖,savelog方法是完全服務於call方法的,打完一次電話就會記錄,那麼savelog方法就應該被隱藏,為什麼? 如圖
我們如果沒有隱藏savelog方法,那麼使用者就有可能直接呼叫savelog方法而略過call方法,但是savelog是服務於call方法的,你連電話都沒打,你記錄什麼?因此,savelog需要被隱藏。但該怎麼隱藏呢?
我們只需要把public改成private即可,修改完以後,savelog就只能在Phone這個類裡使用,而無法在測試類使用
.
6.許可權修飾符
許可權修飾符可以修飾成員,即成員變數和成員方法
不同的許可權修飾符,所修飾的成員的許可權訪問大小不同
.
1.private
修飾的成員的訪問許可權只能在同一個類中 如圖
age只能在Student類中使用,無法在測試類中呼叫,而name可以在測試類中呼叫
當我們在Student類中呼叫age沒有報錯,並且可以在測試類中使用
.
2.(defalut)
修飾的成員的訪問許可權只能在同一個類中,同一個包中
(defalut) 是預設許可權,並不是在變數前面寫這個,而是什麼都不寫 如圖
當Student和測試Student同在project包中,訪問沒問題。當把測試類放到test的包中,訪問就報錯了
.
3.protected
修飾的成員的訪問許可權在同一個類中,同一個包中,不同包的子類中
這個之後再說
.
4.public
任意位置,但別太過分,別跨模組就行(day7和day8不同模組)
.
7.案例
如圖
年齡為-28明顯是錯誤的,但程式這裡不報錯,因此,為了資料的安全性,我們必須私有個人資訊
錯誤的資料進不來了,但正確的資料也進不來了,怎麼辦?先別急,這裡我們需要學習兩個新的方法
.
針對私有的成員變數,提供對應的set xxx 和get xxx方法
set:設定
get:獲取
如圖,我們寫了一個setAge方法,在該方法裡進行判斷年齡是否符合常理,符合則給予賦值,否則提示
1000不符合常理,所有就列印了提升,29則給予賦值,沒有提示
.
寫完setAge還沒有結束,我們會發現現在只是給使用者提供了設定年齡的渠道,但使用者現在沒有獲取年齡的渠道,無法拿著資料進行其他操作
setAge僅能用於設定,並沒有資料返回給setAge,無法用來操作
所以我們還要寫一個getAge方法