第12天 三大特徵之封裝、繼承、多型
阿新 • • 發佈:2021-08-06
面向物件程式設計
- 初時面向物件
- 方法回顧和加深
- 物件的建立分析
- 面向物件三大特徵
- 抽象類和介面
- 內部類和OOP實戰
- 面向物件的三大特徵
封裝
- 該露的露,該藏的藏
- 我們程式設計要求“高內聚,低耦合”。
- 高內聚就是類的內部資料操作細節自己完成,不允許外部干涉;
- 低耦合就是僅暴漏少量的方法給外部使用
- 我們程式設計要求“高內聚,低耦合”。
- 封裝(資料的隱藏)
- 通常,應禁止直接訪問一個物件中的資料的實際表示,而應通過操作介面來訪問,這成為資訊隱藏
- 記住這句話就夠了:屬性私有 get/set
繼承
- 繼承的本質是對某一批類的抽象,從而實現對現實世界更好的建模
- extends的意思是“擴充套件”,子類是父類的擴充套件。
- java中類只有單繼承,沒有多繼承!一個兒子只能有一個爸爸吧,但一個爸爸可以有多個兒子
- 繼承是類和類之間的一種關係,除此之外,類和類之家的關係還有依賴、組合、聚合等
- 繼承關係的兩個類,一個為子類(派生類),一個是父類(基類)。子類繼承父類,使用關鍵字extends來表示。
- 子類和父類之間,從意義上將應該具有“is a“的關係
- object類
opp.demo05中的person----> teacher
----> student
- super
super注意點: 1.super呼叫父類的構造方法,必須在構造方法的第一個; 2.super必須只能出現在子類的方法或者構造方法中; 3.super 和this 不能同時呼叫構造方法! 對比 this: 代表的物件不同; this:代表本身呼叫者這個物件; super:代表父類物件的應用; 前提: this:在沒有繼承,也可以使用; super:只能在繼承條件下才可以使用; 構造方法 this():呼叫本類的構造 super():呼叫父類的構造
- 方法重寫(重點---->多型)
package com.oop.Demo05;
//重寫都是方法的重寫,與屬性無關
public class B {
public /*static*/void test(){
System.out.println("B=>test()");
}
}
package com.oop.Demo05; //繼承關係 public class A extends B { /* alt+insert 選擇Override Metho... 會載入父類的方法 */ //Override重寫的意思 @Override//註解,有功能的註釋 public /*static*/void test() { super.test(); } } /* public class Application { //靜態方法(static)和非靜態方法區別很大 //非靜態 :重寫 只能是public不能是private public static void main(String[] args) { //靜態方法:方法的呼叫只和左邊(定義的型別)的型別有關 //重寫與靜態方法無關,跟非靜態方法有關 A a = new A(); a.test();//A //父類的引用指向了子類 B b = new A();//子類重寫了父類的方法 b.test();//B } } */
重寫:需要有繼承關係,子類重寫父類的方法!
1.方法名必須相同;
2.引數列表必須相同;
3.修飾符:範圍可以擴大,但不能縮小;Public > Protected > Default > private
4.丟擲的異常:範圍可以被縮小,但不能擴大;ClassNotFoundException---> Exception(大)
重寫,子類的方法和父類必須一致,方法體不同!
為什麼需要重寫?
1.父類的功能子類不一定需要或者不一定滿足;
Alt + insert override;
多型(動態編譯:型別:可擴充套件性)
- 即同一方法可以根據傳送對下物件的不同採用多種不同的行為方式
- 一個物件的實際型別是確定的,但可以指向物件的引用的型別有很多(一般指父類或有關係的類)
- 多型存在的條件
- 有繼承關係
- 子類重寫父類
- 父類引用指向子類物件
- 注意:多型是方法的多型,屬性沒有多型性
package com.oop.Demo06;
public class Person {
public void run(){
System.out.println("run");
}
}
/*
多型注意事項:
1.多型是方法的多型,屬性沒有多型
2.父類和子類 有聯絡, 型別轉換異常! ClassCastException!
3.存在的條件:
-繼承關係,
-方法需要重寫,
-父類的引用指向子類物件!Father f1 = new Son();
不能重寫的方法:
1.static 靜態方法 屬於類 它不屬於例項
2.final 常量
3.private
*/
/*
public class Application {
public static void main(String[] args) {
//一個物件的實際型別是確定的
//new Student; 就是一個Student
//new Person; 就是一個Person
//可以指向的型別就是不確定的了:父類的引用指向子類;
//Student能呼叫的方法都是自己或者繼承父類的!
Student s1 = new Student();
//Person 父型別可以指向子類,但不能呼叫子類獨有的方法
Person s2 = new Student();
Object s3 = new Student();
//能執行那些方法,主要看物件左邊的型別,和右邊關係不大
((Student) s2).eat();//子類重寫了父類的方法,執行子類方法
s1.eat();
}
}
*/
- instanceof 型別轉換~指的引用型別轉換, 判斷一個物件是什麼型別
ackage com.oop;
import com.oop.Demo06.Person;
import com.oop.Demo06.Student;
//一個專案應該只存在一個main方法
public class Application {
public static void main(String[] args) {
//型別之間的轉換:父 子
//高 低
Person obj = new Student();
//student將這個物件轉換為Student型別,我們就可以使用Student型別方法了!
//student.go;會直接報錯,所以轉換如下
((Student)obj).go();
//子類轉換為父類可能會丟失自己本來的一些方法
}
}
/*
1.父類引用指向子類物件
2.子類要轉換為父類,向上轉型,不用強制轉換
3.父類轉化為子類,向下轉型,需要強制轉換
4.方便方法的呼叫,減少重複的程式碼!使程式碼更簡潔
抽象:封裝、繼承、多型---------------即程式設計思想
下一步會學習抽象類 介面
*/