1. 程式人生 > 其它 >第12天 三大特徵之封裝、繼承、多型

第12天 三大特徵之封裝、繼承、多型

面向物件程式設計

  1. 初時面向物件
  2. 方法回顧和加深
  3. 物件的建立分析
  4. 面向物件三大特徵
  5. 抽象類和介面
  6. 內部類和OOP實戰


  1. 面向物件的三大特徵

封裝

  • 該露的露,該藏的藏
    • 我們程式設計要求“高內聚,低耦合”
      • 高內聚就是類的內部資料操作細節自己完成,不允許外部干涉;
      • 低耦合就是僅暴漏少量的方法給外部使用
  • 封裝(資料的隱藏)
    • 通常,應禁止直接訪問一個物件中的資料的實際表示,而應通過操作介面來訪問,這成為資訊隱藏
  • 記住這句話就夠了:屬性私有 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.方便方法的呼叫,減少重複的程式碼!使程式碼更簡潔
抽象:封裝、繼承、多型---------------即程式設計思想
下一步會學習抽象類  介面
 */