1. 程式人生 > 實用技巧 >Day_06_Java基礎階段_面向物件OOP

Day_06_Java基礎階段_面向物件OOP

目錄

面向過程&面向物件

  • 面向過程思想
    • 步驟清晰簡單,第一步做什麼,第二步做什麼......
    • 面對過程適合處理一些較為簡單的問題
  • 面對物件思想
    • 物以類聚,分類的思維模式,思考問題首先會解決問題需要哪些分類,然後對這些分類進行單獨思考。最後,才對某個分類下的細節進行面向過程的思索
    • 面向物件適合處理複雜的問題,適合處理需要多人協作的問題!
    • 對於描述複雜的食物,為了從巨集觀上把握,從整體上合理分析,我們需要使用面向物件的思路來分析整個系統。但是,具體到微觀操作,仍然需要面向過程的思路去處理

什麼是面向物件

  • 面向物件程式設計(Object-Oriented Programming,OOP)
  • 面向物件程式設計的本質就是:以類的方式組織程式碼,以物件的組織(封裝)資料
  • 抽象
  • 三大特性:
    • 封裝
    • 繼承
    • 多型
  • 從認識論角度考慮是現有物件然後有類。物件,是具體的食物。類,是抽象的,是對物件的抽象
  • 從程式碼執行角度考慮是現有類後又物件,類是物件的模板

回顧方法及加深

  • 方法的定義
    • 修飾符
    • 返回型別
    • breakreturn的區別
    • 方法名
    • 引數列表
    • 異常丟擲
  • 方法的呼叫
    • 靜態方法
    • 非靜態方法
    • 形參和實參
    • 值傳遞的引用型別
    • this關鍵字

類與物件的關係

  • 類是一種抽象的資料型別,它是對某一類食物整體描述/定義,但是並不能代表某一個具體的食物
    • 動物、植物、手機、電腦。。。。
    • Person類、Pet類、Car類等,這些類都是用來描述/定義某一類具體的事物應該具備的特點和行為
  • 物件是抽象概念的具體例項
    • 張三就是人的一個具體例項,張三家裡的旺財就是狗的一個具體例項
    • 能夠體現出特點,展現出功能的是具體的例項,而不是一個抽象的概念

建立與初始化物件

  • 使用new建立物件

  • 使用new關鍵字建立的時候,出了分配記憶體空間以外,還會給建立好的物件進行預設的初始化以及對類中構造器的呼叫

    package com.yushaoyi.oop.demo01;
    
    /**
     * @author ZhuYuchen
     * @create 2020-09-14-16:31
     * @site https://www.cnblogs.com/yushaoyi/
     */
    public class Student {
        //屬性:欄位
        String name; //null
        int age;     //0
    
    
        //方法
        public void study(){
            System.out.println(this.name+"學生在學習");
        }
    }
    
    package com.yushaoyi.oop.demo01;
    
    /**
     * @author ZhuYuchen
     * @create 2020-09-14-16:32
     * @site https://www.cnblogs.com/yushaoyi/
     */
    //一個專案應該只有一個main方法
    
    public class Application {
        public static void main(String[] args) {
            //類是抽象的,需要例項化
            //類例項化後會返回一個自己的物件;
            //student物件就是一個Student類的具體例項
            Student xiaoming = new Student();
            Student xiaohong = new Student();
            xiaoming.name = "xiaoming";
            xiaoming.age = 3;
            System.out.println(xiaoming.name);
            System.out.println(xiaoming.age);
            xiaohong.name = "xiaohong";
            xiaohong.age = 3;
            System.out.println(xiaohong.name);
            System.out.println(xiaohong.age);
    
        }
    }
    
    
  • 類中的構造器也稱為構造方法,是在建立物件的時候必須要呼叫的,並且構造器有一下兩個特點:

    • 必須和類的名字相同
    • 必須沒有返回型別,也不能寫void
  • 構造器必須要掌握

  • 構造器的作用

    • new本質在呼叫構造方法
    • 初始化物件
  • 注意點

    • 定義了有參構造之後,如果想使用無參構造,必須自己定義一個,不能直接使用
  • idea快捷鍵 alt+insert

    package com.yushaoyi.oop.demo01;
    
    /**
     * @author ZhuYuchen
     * @create 2020-09-14-16:46
     * @site https://www.cnblogs.com/yushaoyi/
     */
    public class Person {
        //一個類即使什麼都不屑,它也會存在一個方法
        //顯示的定義構造其
        String name;
        int age;
        //例項化初始值
        //1.使用new關鍵字,本質是在呼叫構造器
        //2.用來初始化值
        //一旦定義了有參構造,無參構造必須顯示定義
    
    
        public Person(String name) {
            this.name = name;
        }
    
        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
        /*
        *         Person person = new Person("yushaoyi");
            System.out.println(person.name);
            * */
    }
    
    

封裝

  • 該露的露,該藏的藏
    • 我們程式設計要追求“高內聚,低耦合”。高內聚就是類的內部資料操作細節自己完成,不允許外部干涉;低耦合:僅暴露少量的方法給外部使用
  • 封裝
    • 通常,應該禁止直接訪問一個物件中資料的實際表示,而應通過操作介面來訪問,這稱為資訊隱藏
  • 記住這句話就夠了:屬性私有 get/set
  • 封裝的意義
    • 提高程式的安全性,保護資料
    • 隱藏程式碼的實現細節
    • 統一介面
    • 系統的可維護性增加了

繼承

  • 繼承的本質是對某一批類的抽象,從而實現對現實世界更好的建模
  • extands的意思是“擴充套件”。子類是父類的擴充套件
  • Java中只有單繼承,沒有多繼承!:一個兒子只能有一個爸爸,一個爸爸可以有多個兒子
  • 繼承是類和類之間的一種關係。除此之外,類和類之間的關係還有依賴、組合、聚合等。
  • 繼承關係的兩類,一個為子類,一個為父類,子類繼承父類,用關鍵詞extends來表示
  • 子類和父類之間,從意義上講應該具有“is a”的關係
  • object
    • 在Java中所有的類都預設直接或者間接繼承object
  • super
    • super()呼叫父類的構造方法,必須在構造方法的第一個
    • super只能出現在子類的方法或者構造方法中
    • superthis不能同時呼叫方法
    • Vs this
      • 代表的物件不同
        • this:本身呼叫著這個物件
        • super:代表父類物件的引用
      • 前提
        • this:沒有繼承也可以使用
        • super:只能在繼承條件下才可以使用
      • 構造方法
        • this():本類的構造
        • super():父類的構造
  • 方法重寫:重點——>多型
    • 重寫都是方法的重寫和屬性無關
    • 需要有繼承關係,子類重寫父類的方法
    • 方法名必須相同
    • 引數列表必須相同
    • 修飾符範圍可以擴大:public>protected>default>private
    • 丟擲的異常範圍可以被縮小,但不能擴大
      • ClassNotFoundException——>Exception(大)
  • 重寫的時候,子類的方法和父類必須要一致,方法體不同!
  • 為什麼需要重寫
    • 父類的功能子類不一定需要,或者不一定滿足
    • Alt+insert : override;

多型

  • 動態編譯:型別
  • 即同一方法可以根據傳送物件的不同而採用多種不同的行為方式
  • 一個物件的實際型別是確定的,但可以指向物件的引用的型別有很多(父類,有關係的類)
  • 執行看左邊,編譯看右邊
    • 能不能執行方法需要看左邊的類裡有沒有對應的方法
    • 編譯出來的結果看右邊的類裡有沒有重寫該方法,如果沒有就正常編譯,如果有,就按照重寫後的程式碼編譯
  • 多型是方法的多型,屬性沒有多型性
  • 父類和子類有聯絡 沒有聯絡轉換就會產生型別轉換異常 :ClassCastException!
  • 存在條件
    • 繼承關係
    • 子類重寫父類方法
    • 父類的引用指向子類物件father f1 = new son();
  • 不可重寫方法的幾種常見例子
    • static屬於類,不屬於例項
    • final常量
    • private
  • instanceof 型別轉化(引用型別),判斷一個物件是什麼型別

抽象類

  • abstract修飾符可以用來修飾方法也可以修飾類,如果修飾方法,那麼該方法就是抽象方法,如果修飾類,就是抽象類
  • 抽象類中可以沒有抽象方法,但是有抽象方法的類一定要宣告為抽象類
  • 抽象類,不能使用new關鍵字來建立物件,它是用來讓子類繼承的
  • 抽象方法,只有方法的宣告,沒有方法的實現,它是用來讓子類實現的
  • 子類繼承抽象類,那麼就必須要實現抽象類沒有實現的抽象方法,否則該子類也要宣告為抽象類
  • 抽象類中的約束不像介面那麼嚴格,你可以在抽象類中定義
    • 構造方法
    • 抽象方法
    • 普通屬性
    • 方法
    • 靜態屬性和靜態方法

介面

  • 普通類:只有具體實現

  • 抽象類:具體實現和抽象方法都有

  • 介面:只有抽象方法

  • 介面就是規範,定義的是一組規則,體現了現實世界中“如果你是...則必須能...”的思想。如果你是天使,則必須能飛,如果你是汽車,則必須能跑,如果你是好人,則必須幹掉壞人,如果你是壞人,則必須欺負好人

  • 介面的本質是契約,就像我們人類的法律一樣,指定好後大家都遵守

  • OO的精髓,是對物件的抽象,最能體現這一點的就是介面,為什麼我們討論設計模式都只針對具備了抽象能力的語言,就是因為設計模式所研究的,實際上就是如何合理的去抽象

  • 宣告類的關鍵字是class,宣告介面的關鍵字是interface

  • 作用

    • 約束
    • 定義一些方法,讓不同的人實現
    • 方法都是public abstract
    • 常量都是public static final
    • 介面不能例項化,介面中沒有構造方法
    • implements可以實現多個介面
    • 必須要重寫介面中的方法

內部類

  • 內部類就是在一個類的內部在定義一個類,比如A類中定義一個B類,那麼B類相對A類來說就稱為內部類,而A類相對B類來說就是外部類類
  • 成員內部類
  • 靜態內部類
  • 區域性內部類
  • 匿名內部類

總結

面向物件這一部分是Java中比較抽象的一部分,程式碼部分不多,許多都是概念問題,還有培養我們的抽象思維能力,所以這部分的筆記可以時常觀看回憶