面向物件三大特性(封裝、繼承、多型)
面向物件三大特性(封裝、繼承、多型)
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.子類繼承了父類,就會擁有父類全部的方法(當然父類的私有方法不行哦)
- 父類若沒有無參構造器,子類則也寫不了無參構造器 (只能在子類中 呼叫父類的有參構造 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.子類重寫了父類的方法,所以父親物件執行的是子類的方法