面向物件基本思想
1、OO概述
1.1、面向程序和面向物件的比較
* 對于一個問題的解決,面向程序,需要考慮其每一步的實作,不適合處理復雜的問題;
* 面向物件思想是一種分類的思維模式,即思考一個問題需要哪些分類,然后對分類進行單獨的思考,最后才會對某個分類下的細節進行面向程序的思索;
* 面向物件更適合處理復雜的問題,適合處理需要多人協作的問題;
* 對于描述復雜的事物,需要用面向物件的思想去宏觀上分析整個系統,但在具體的微觀操作的設計上,依舊需要使用面向程序思想去處理;
1.2、面向物件編程
以類的方式組織代碼,以物件的方式封裝資料;
1.3、面向物件的三大特征
* 封裝:對資料進行封裝,然后,對外提供一個操作資料的介面,使外界只能通過這些特定介面去訪問資料,賦予了物件“黑盒”的特性
* 繼承:是一個物件獲取另一個物件屬性的程序
* 多型:一個程式中相同名字的方法表示不同含義的情況,方法的多載是靜態多型,方法的覆寫是動態多型
1.4、類和物件的理解
* 抽象:從眾多的事物中抽取出共同的特征
* 物件是具體的事物,類是對物件的抽象
* 物件是現實世界中明確標識的物體,每個物件都有自己獨特的狀態行為和標識
* 物件的狀態: 也稱為物件的特征和屬性,是由當前資料域的值決定的
* 物件的行為:也稱為動作,是由物件中的方法決定的
* 物件標識:類是物件的模板,物件是類的實體,可以以一個類為模板創建多個物件(實體化),物件的標識用來區分這些物件
* 當一個物件使用完畢,不在被參考時,就會被垃圾回收器(gc)回收
1.5、OOP的優勢
* 易維護
* 可重用
* 可擴展
1.6、面向物件(OO)的三大領域
* 面向物件分析(OOA)
* 面向物件設計(OOD)
* 面向物件編程(OOP)
2、變數的作用域和生存期
1.1、變數作用域
* 變數的作用域變數可以在程式的什么范圍內可以使用
* Java程式中作用域是通過塊來實作的(Java中的大括號)
* 變數在哪個塊中被宣告,它的作用域就在哪一個塊
2.2、變數的生存期:
* 變數的生存期是物件被分配記憶體記憶體的時間期限
* 對于區域變數(基本型別),在宣告時系統為該變數分配記憶體,當方法回傳時,該變數從記憶體堆疊中清除
* 對于物件:在new創建物件時,系統將在堆中為它分配記憶體,當它不在被參考時,在之后的某一時刻,垃圾回收器運行時才能被回收
3、包機制
* 包是對類的封裝,以一組相關類或者介面的集合
* 不同的包中可以有同名的類
* 通過包可以實作對類的訪問控制
* Java中**package**關鍵字標識當前編譯單元所屬的包
* Java中用**import**關鍵字引入包
* 在Java5中允許使用import static 來匯入類的常量和靜態方法,這樣在使用時就不需要加類名前綴了
4、Java編譯單元(源檔案)
* java編譯單元可以包含一個package陳述句,多個import陳述句以及類、介面和列舉定義
* 一個編譯單元只能有一個public類,并且該類名必須和源檔案的主檔案名必須和該類類名相同
5、類的繼承和多型
5.1、類的繼承和方法覆寫
* 繼承是對父類的擴展,子類通過繼承獲得父類屬性和方法
* Java中只有單繼承,A extends b 將a宣告為b的直接子類
* 子類可以在類體中重寫(覆寫)繼承自父類的方法,用@Override注解來避免寫錯方法頭
* 子類覆寫父類方法被訪問的權限不能比父類高
* 類的被訪問權限高到低 private>預設>protected>public
* private方法不能覆寫!,如果在子類中定義了一個方法在父類中是private修飾的,那么這兩個方法無關
* 父類中的static方法可以被繼承,但不能被覆寫,如果子類中定義了相同的static方法,那么該父類方法會被隱藏,但使用父類.方法名仍然可以使用
* 方法的多載和方法的覆寫的區別
*方法多載是在同一個類中定義多個名稱相同而引數不同的方法,而方法的覆寫是在子類中對繼承自父類的方法提供一種不同的實作,方法頭、引數、回傳值都是和父類相同的
* super關鍵字用來參考當前物件的父類物件
* 在子類中呼叫父類的構造方法super(引數串列);
* 在子類中訪問父類中被隱藏的物件super.variableName;
* 在子類中訪問父類中被覆寫的方法super.methodName(引數串列)
* 不能用super呼叫間接父類的構造方法,super.super();是不合法的
* 可以在構造方法中用this呼叫本類的其他構造方法this.構造方法(引數串列);
* 在構造方法中使用this呼叫本類的其他構造方法和super呼叫父類構造方法都只能是方法的第一條陳述句且只能有一條陳述句,所以二者不能在一個構造方法中
* 創建子類物件時候,系統首先呼叫所有父類的構造方法,包括所有類的根類Object
5.2、封裝性和訪問修飾符
* 類(包括介面、列舉)的訪問權限`
* public:可以被任何其他類使用
* 預設訪問修飾符(不寫):只能被同一包內的類使用
* 類的成員變數訪問權限(在類中創建該類實體.訪問)
* private 只能被類本身訪問,外界只能通過該類提供的介面訪問
* 預設 同一包內的類可以訪問
* protected 可以被統一包內的類和其子類訪問
* public 可以被任何類訪問
* final修飾符的作用
* final修飾類,該類就會成為最終類,不能被繼承
* final修飾方法,該方法就不能被子類覆寫
* final修飾變數,該變數變為常量,一經賦值不能更改
* final修飾引數,則該引數在方法中只能使用但不能被改變
* final修飾一個參考變數,表示該變數的參考(地址)不能改變,即不能使用該變數指向另一個物件,但物件本身可以改變
* 成員變數一般和static修飾符連用,構成編譯時常量,編譯器將該常量值代入任何可能使用到它的運算式中,以減輕運行時的負擔
5.3、抽象類
* 抽象類是用關鍵字abstract修飾的類,其中可以定義抽象方法,抽象方法也使用abstract修飾,只有宣告沒有具體的實作
* 抽象類不能實體化,但可以被宣告;抽象類的子類需要實作抽象類中的所有方法,除非子類本身也是抽象類,
* 抽象類中可以定義非抽象方法,甚至可以沒有抽象方法,但即使沒有抽象方法,它還是要被一個非抽象子類繼承才可以使用
* abstract 類必須被繼承才有意義,而final修飾的類不能被繼承,所以這兩個關鍵字不能再定義類的時候同時使用
* abstract類中有構造方法
* 物件的轉換和多型
* 繼承關系使子類繼承了父類的特性,并且可以擴展一些新的特性,子類是父類的特殊化,子類和父類的關系是(is a)關系,子類 is a 父類
* 子類物件和父類物件在一定條件下也可以互相轉換
* 子類可以自由轉換成父類物件但要損失子類本身擴展的特性
* 父類物件轉換子類物件需要強制型別轉換,但在轉換之前要使用instanceof運算子判斷它指向的是不是要轉換的子型別別的物件,否則容易出現類轉換異ClassCastException
* instanceof運算子 物件 instanceof 類名 判斷這個物件是不是該類的實體
5.4、多型
* 多型就是多種形式,指Java程式中一個類或多個類中可以定義多個同名的方法,這多個同名的方法可以完成不同的操作
* 多型性是指在程式運行時判斷應該執行哪個方法代碼的能力
* 多型分為靜態多型(編譯時多型)和動態多型(運行時多型),前者通過方法多載實作,后者通過方法覆寫實作
* 系結:方法呼叫和方法體的關聯程序
* 前期系結:程式執行前系結
* 后期系結:程式執行時系結
* Java中除了用static和final修飾的方法外,其余都是后期系結(動態系結)
* 動態多型實作機制:方法的動態系結
* 對于多載的方法,在運行時根據傳遞的引數來系結方法體
* 在父類中宣告的方法被子類繼承,如果該方法被子類覆寫,在子類呼叫該方法時會系結子類覆寫的方法體;
* 如果子類沒有覆寫該方法,則通過子類呼叫該方法時系結父類原有方法體
* 如果一個方法中的引數是父類,那么該方法的引數可以傳遞該父類的任意子類物件
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/228904.html
標籤:面向對象
上一篇:渣本僥幸獲得內推阿里,技術四面,斬獲offer,定級P6!
下一篇:面向物件基本概念2-核心
