1. 程式人生 > 其它 >面向物件三大特性(封裝、繼承、多型)

面向物件三大特性(封裝、繼承、多型)

面向物件三大特性(封裝、繼承、多型)

1. 封裝

1.裝起來,只留一個口 該露的露,該藏得藏

2.高內聚(類的內部資料操作細節自己完成,不允許外部干涉)低耦合(僅暴露少量的方法給外部使用)

3.封裝(資料的隱藏):通常,應禁止直接訪問一個物件中資料的實際表示,而應通過操作介面來訪問,這稱為資訊隱藏。

4.記住屬性私有private,get/set一般屬性要私有,屬性要私有屬性要私有屬性要私有

(以前public屬性 可以直接呼叫和賦值,現在private屬性不能那樣了,所以想操作這些私有屬性,通過get、set來操作)

5.封裝一般使對於屬性 ,對於方法很少使用

封裝的意義優點:

/*
* 封裝的好處
* 1.提高程式的安全性,保護資料,防止破壞程式(如輸入不切實際的年齡660歲)
* 2.隱藏程式碼的實現細節。
* 3.統一介面 get set
* 4.提高系統的可維護性。
*
* */

2. 繼承

1.繼承的本質是對某一批類的抽象,從而實現對現實世界更好的建模

2.extends 擴充套件,子類(派生類)父類(基類)的擴充套件

3.Java中類只有單繼承,沒有多繼承!(一個子類只能有一個父類,但一個父類可以有多個子類)

​ 子類直接的只能繼承一個父類,能間接的繼承多個

4.繼承是類和類之間的一種關係。(類和類之間的關係有:繼承,依賴,組合,聚合)

5.繼承關係的兩個類,一個為子類(派生類),一個為父類(基類)。子類繼承父類,用關鍵字extends表示。

6.子類和父類之間,從意義上講應該具有is a的關係。

7.在Java中,所有的類都預設直接或間接繼承Object類

8.子類不能繼承父類的私有方法或者屬性

9.子類繼承了父類,就會擁有父類全部的方法(當然父類的私有方法不行哦)

  1. 父類若沒有無參構造器,子類則也寫不了無參構造器 (只能在子類中 呼叫父類的有參構造 super("123");)

​ 所以一般任何類寫了有參構造之後,要把無參構造加上,即顯示錶達出來

this 和 super

this 指當前類的什麼

super 指父類的什麼

# super注意點
    1.super呼叫父類的構造方法,必須在構造方法的第一個,第一行
    2.super必須只能出現在子類的方法或者構造方法中(若在父類中呼叫super,則呼叫到父類的父類Object中去了)
    3.super 和this 不能同時呼叫構造方法!	super() 和this()不能同時出現

# this
    和super 代表的物件不同:
        this: 本身呼叫者的這個物件
        super:代表呼叫者的父類物件的引用
    前提
        this:沒有繼承也可以使用
        super:只能在繼承條件下才能使用
    構造方法
        this(); 呼叫本類的無參構造   this("123"); 呼叫本類的有參構造
        super(); 呼叫父類的無參構造!super("123"); 呼叫父類的有參構造
        呼叫子類的無參構造器時,父類的無參構造器先執行,(預設在子類的構造器中,有super()在第一行)

方法的重寫

方法重寫是子類父類才有的,子類繼承父類之後,子類重寫父類的方法,是執行子類的方法,並不是改變父類的方法

重寫的方法跟父類的被重寫方法長的一樣,只是方法的實現不同(方法體不同)

重寫都是方法的重寫,和屬性無關,且重寫是針對非靜態方法的,與靜態方法無關

重寫的方法只能是public的 ,不能是private

///靜態方法和非靜態方法區別很大!

​ //靜態方法:靜態方法的呼叫只和左邊,定義的資料型別有關。
​ //非靜態方法:才是重寫!!

//靜態方法的呼叫只和左邊,定義的資料型別有關。
B b = new A();//父類的引用指向了子類 父類:B 父類的引用:b 指向了子類:= new A();

重寫非靜態方法,子類重寫了父類的方法。

靜態方法和非靜態方法區別很大!

總結:方法的重寫

# 總結:方法的重寫  Alt + Insert 選Override Methods
    前提:需要有繼承關係,子類父類中才有的,子類繼承父類,子類重寫父類的方法。
        重寫是針對方法的,而且是非靜態方法(與靜態方法無關),與屬性無關。
    1. 方法名需要相同(子類中重寫的方法和父類中被重寫的方法名需要相同)
        重寫:子類的方法和父類必須一致,方法體不同!
    2. 引數列表必須相同 
    3. 修飾符:範圍可以擴大,不能縮小 (public > protected > default > private)
    4. 丟擲的異常:範圍可以被縮小,但不能擴大  ClassNotFoundException --> Exception(大)
## 為什麼需要重寫?
    1.父類的功能,子類不一定需要,或者不一定滿足!

哪些方法不能被重寫??

* 哪些方法不能被重寫?
*   1.static方法 ,屬於類,不屬於例項。
*   2.final 常量池裡的  不能改變
*   3.private 方法 私有的 也不能被重寫!

程式碼演示

public class Application {
    public static void main(String[] args) {
        System.out.println("Hello World !");
        A a = new A();
        System.out.println(a);
        a.test();

        B b = new B();
        System.out.println(b);
        b.test();

		//方法重寫 方法重寫是針對非靜態方法的,與靜態方法無關,與屬性無關
        System.out.println("---------方法重寫--(針對非靜態方法)--修飾符範圍可以變大,不能縮小------");
			//丟擲的異常:範圍可以被縮小,但不能擴大  ClassNotFoundException --> Exception(大)
        //父類 和子類都是public方法 可重寫
        //父類是protected方法 ,子類修飾符範圍不能變小,可以是protected方法,也可以是public方法
        //(public > protected > default > private)
        B a1 = new A();
        System.out.println(a1);
        a1.test();
    }
}

3. 多型

動態編譯 :型別 :可擴充套件性

同一方法可以根據傳送物件的不同而採用多種不同的行為方式。(都是run(),執行的結果不一樣)

一個物件的實際型別是確定的,但是它可以指向的引用型別就不確定了(父類或者有關係的類)

物件能執行哪些方法,主要看物件左邊的型別(和繼承關係),和右邊關係不大!(子類重寫父類方法,那就執行子類的方法)

//一個物件的實際型別是確定的。
//它可以指向的引用型別就不確定了:父類的引用指向了子類的型別
        Student s1 = new Student();/*一個類的實際物件的型別是確定的 都是Student*/
        Person s2 = new Student();/*但它指向的引用型別是不確定的,現在是它的父型別*/父類的引用指向了子類的型別
        Object s3 = new Student();/*但它指向的引用型別是不確定的,現在是它的祖宗型別*/祖宗型別的引用指向了子類的型別
//多型:都是new的Student(),但是物件的型別不同(Student Person Object)            
//前提 ,有父子關係或祖宗關係!例如Student繼承了Person, 
        沒關係的肯定不行(Student 和 String 無關,所以不能String s4 = new Student();)
        
            
            
        //Student 能呼叫的方法都是自己的或者繼承父類的!
        Student s1 = new Student();
		//Person 父型別,可以指向子類,但是不能呼叫子類獨有的方法
/*****父類的引用指向了子類*******/
        Person s2 = new Student();
        Object s3 = new Student();
/*總結:
        *擁有繼承關係後,可以Person s2 = new Student();
* Student s1 = new Student();/*一個類的實際物件的型別是確定的 都是Student
* Person s2 = new Student();/*但它指向大的引用型別是不確定的,是它的父型別和祖宗型別
*
*
*物件能執行哪些方法,主要看物件左邊的型別(和繼承關係),和右邊關係不大!
*沒重寫時,父親自己有這個方法,父親物件執行父親的方法 2.子類重寫了父類的方法,所以父親物件執行的是子類的方法
*
* */

多型的注意事項

/*多型的注意事項
*   1.多型是方法的多型,屬性沒有多型       重寫也是針對非靜態方法的,與屬性和靜態方法無關
*   2.父類和子類,有聯絡,String Perosn       型別轉換異常ClassCastException      
						String s4 = new Student(); 是不行的	(因為String 和Student無關)
*   3.多型存在的條件: 有繼承關係,方法需要重寫, 父類引用指向子類物件! Father f1 = new Son();
*  
*
*
* 哪些方法不能被重寫?
*   1.static方法 ,屬於類,不屬於例項。
*   2.final 常量池裡的  不能改變
*   3.private 方法 私有的 也不能被重寫!
*
* */

注意點:

1. 封裝是對於屬性,很少封裝方法

2. 繼承是類和類之間的一種關係 (所有類預設都繼承Object類,Object類是所有類的父類或祖宗類)

(類和類之間的關係有:繼承,依賴,組合,聚合)

3. 多型是方法的多型,屬性沒有多型

方法重寫是針對靜態方法的,與靜態方法無關,與屬性無關

判斷兩個方法是否相同(1.方法名 2. 引數)

封裝 之後 才能繼承 繼承之後才能多型

物件能執行哪些方法,主要看物件左邊的型別(和繼承關係),和右邊關係不大!

*沒重寫時,父親自己有這個方法,父親物件執行父親的方法 2.子類重寫了父類的方法,所以父親物件執行的是子類的方法