1. 程式人生 > 實用技巧 >第七章、面向物件(四)

第七章、面向物件(四)

第七章 面向物件

今天內容

1.訪問控制
2.封裝
3.static關鍵字
4.繼承
5.方法的重寫

訪問控制

常見的訪問控制

public - 公開的
protected - 保護的
預設方式 - 預設的
private - 私有的

訪問控制符的比較

訪問控制符       訪問許可權    本類     本包中的其他類    子類      其他包中的其他類
----------------------------------------------------------------------------
public          公開的     1            1           1            1
protected       保護的       1            1           1            
預設方式            預設的       1            1
private         私有的       1
 
要求大家掌握:
    a.通常情況下,所以的成員變數都用private修飾,所有的成員方法都用public修飾。
    b.public修飾的內容表示可以在任意位置進行訪問;
    c.private修飾的內容只能在本類的內部進行訪問。

包的定義

    package 包名; - 表示建立單層包
    package 包名1.包名2.....包名n - 表示建立多層包,也就是多層目錄;
            為了管理檔案方便,避免檔案同名引起的衝突。

封裝(重點)

基本概念

通常情況下在測試類中可以給成員變數賦值一些合法但不合理的數值,而程式的執行過程無法檢測和提示,和我們的現實有點不太符合。
為了避免上述情況的發生,就需要對成員變數的賦值操作進行合理性的判斷和提示,該方式就叫做封裝,通俗的來說,封裝就是一種保證我們成員變數值合理的機制。

封裝的流程

(1)私有化成員變數,使用private關鍵字修飾;
(2)提供共有的get成員變數和set成員變數的方法,在方法體中進行合理的判斷。
(3)在構造方法體中呼叫set成員變數進行合理值得判斷

練習

自定義Person類實現該類的封裝,特徵有:姓名、年齡以及國籍,提供一個列印特徵的方法。
自定義TestPerson型別,在main()方法中建立Person類的物件並列印特性。

static 關鍵字

基本概念

通過情況下成員變數都隸屬於物件層級,每個物件都擁有獨立的記憶體空間來記錄自己獨有的成員變數,
當所有的物件的成員變數值都完全一樣的時候,若每個物件單獨記錄則會造成記憶體空間的浪費,此時
應該將該成員變數有物件層級提升到類層級,在記憶體空間中只保留一份而且被所有的物件所共享,為
了實現該效果使用static關鍵字來進行修飾,表示靜態的含義。
static關鍵字可以修飾成員變數和成員方法表示隸屬於類層級,推薦使用類名.的方式訪問

使用方式

對於非靜態的成員方法來說,既可以訪問非靜態的成員同時也可以訪問靜態的成員;(成員:成員變數+成員方法)
對於靜態的成員方法來說,只能訪問靜態的成員不能訪問非靜態的成員;
    (執行靜態方法時候可以還沒有建立物件,非靜態成員隸屬於物件層級)
只有被所有物件共享的內容才能加static。static不能隨便加。

練習:

自定義Singleton類,實現該類的封裝
自定義TestSingleton類,在main方法中有且只能得到Singleton類中的一個物件。

繼承

人類:
    特性:姓名、年齡
    行為:吃飯、娛樂
 
 
學生類
    特徵:學號
    行為:學生
 
教師類
    特徵:薪水
    行為:講課
 
..........

基本概念

當多個類之間有相同的特徵和行為的時候,就可以將相同的內容提取出來組成一個新類,讓原來的這些繼承自新類就可以了,從而實現原來的這些類吸收新類中的成員的效果,此時在原來這些類中只需要編寫自己獨有的成員即可。
 
換一句話來說,繼承就是一種用於提高程式碼複用性、可維護性以及可擴充套件性的機制。
在Java語言中使用extends關鍵字來代表繼承的關係。
 
比如:
    class Student extends Person{  } --- 表示Student類繼承自Person
    其中Person 類叫做超類/父類/基類
    其中Student類叫做  子類/孩子類/派生類

注意事項

1.子類可以繼承父類中的成員變數,包括私有的成員變數,但不能直接訪問;
  子類不可以繼承父類中的構造方法以及私有的成員方法。
2.構造子類物件時候會自動呼叫父類中的無參構造方法,用於初始化從父類中繼承下來的
成員變數資訊,相當於在子類構造方法中的第一行增加程式碼:super();
 
3.在java語言中只支援單繼承,也就是一個子類只能有一個父類,但一個父類可以有多個子類;
4.只有滿足:子類 is a 父類的邏輯關係才能用繼承,不能濫用繼承;

super關鍵字和this關鍵字的比較

基本概述

this關鍵字代表本類的物件
super關鍵字代表父類的物件

使用方式

使用this.方式可以訪問本來的成員變數和成員方法
使用super.方式可以訪問父類的成員變數和成員方法
 
 
使用this()的方式在構造方法的第一行表示呼叫本類的構造方法。
使用super()的方式在構造方法的第一行表示呼叫父類的構造方法。
 
class Person{
    private int age;
    public void setAge(int age){
            this.age = age;    
    }
 
}
 
 
要求大家掌握的用法:
    1.使用this.的方式可以區分同名的形參變數和成員變數。
    2.使用super(實參)的方式在構造方法的第一行可以呼叫父類的構造方法。
    3.使用super.的方式可以呼叫父類中被重寫的方法。

方法的重寫

當父類中繼承下來的方法不足以滿足子類需求的時候,則需要在子類中重寫一個與父類一模一樣的(方法名相同、引數列表相同、返回值型別相同)的方法,叫做方法的重寫/覆蓋。

方法重寫的原則:

1.相同的方法名稱,相同的引數列表,相同的返回值型別或者返回子類。
2.訪問許可權不能變小,可以變大。
3.不能丟擲更大的異常。
 
在子類重寫的方法中,可以通過super關鍵字呼叫父類的“原始”方法。