面向對象基本思想
一、OO概述
1.一、面向過程和麪向對象的比較
* 對於一個問題的解決,面向過程,須要考慮其每一步的實現,不適合處理複雜的問題;
* 面向對象思想是一種分類的思惟模式,即思考一個問題須要哪些分類,而後對分類進行單獨的思考,最後纔會對某個分類下的細節進行面向過程的思索;
* 面向對象更適合處理複雜的問題,適合處理須要多人協做的問題;
* 對於描述複雜的事物,須要用面向對象的思想去宏觀上分析整個系統,但在具體的微觀操做的設計上,依舊須要使用面向過程思想去處理;
1.二、面向對象編程
以類的方式組織代碼,以對象的方式封裝數據;
1.三、面向對象的三大特徵
* 封裝:對數據進行封裝,而後,對外提供一個操做數據的接口,使外界只能經過這些特定接口去訪問數據,賦予了對象「黑盒」的特性
* 繼承:是一個對象獲取另外一個對象屬性的過程
* 多態:一個程序中相同名字的方法表示不一樣含義的狀況,方法的重載是靜態多態,方法的覆蓋是動態多態
1.四、類和對象的理解
* 抽象:從衆多的事物中抽取出共同的特徵
* 對象是具體的事物,類是對對象的抽象
* 對象是現實世界中明確標識的實體,每一個對象都有本身獨特的狀態行爲和標識
* 對象的狀態: 也稱爲對象的特徵和屬性,是由當前數據域的值決定的
* 對象的行爲:也稱爲動做,是由對象中的方法決定的
* 對象標識:類是對象的模板,對象是類的實例,能夠以一個類爲模板建立多個對象(實例化),對象的標識用來區分這些對象
* 當一個對象使用完畢,不在被引用時,就會被垃圾回收器(gc)回收
1.五、OOP的優點
* 易維護
* 可重用
* 可擴展
1.六、面向對象(OO)的三大領域
* 面向對象分析(OOA)
* 面向對象設計(OOD)
* 面向對象編程(OOP)
二、變量的做用域和生存期
1.一、變量做用域
* 變量的做用域變量能夠在程序的什麼範圍內可使用
* Java程序中做用域是經過塊來實現的(Java中的大括號)
* 變量在哪一個塊中被聲明,它的做用域就在哪個塊
2.二、變量的生存期:
* 變量的生存期是對象被分配內存內存的時間期限
* 對於局部變量(基本類型),在聲明時系統爲該變量分配內存,當方法返回時,該變量從內存棧中清除
* 對於對象:在new建立對象時,系統將在堆中爲它分配內存,當它不在被引用時,在以後的某一時刻,垃圾回收器運行時才能被回收
三、包機制
* 包是對類的封裝,以一組相關類或者接口的集合
* 不一樣的包中能夠有同名的類
* 經過包能夠實現對類的訪問控制
* Java中**package**關鍵字標識當前編譯單元所屬的包
* Java中用**import**關鍵字引入包
* 在Java5中容許使用import static 來導入類的常量和靜態方法,這樣在使用時就不須要加類名前綴了
四、Java編譯單元(源文件)
* java編譯單元能夠包含一個package語句,多個import語句以及類、接口和枚舉定義
* 一個編譯單元只能有一個public類,而且該類名必須和源文件的主文件名必須和該類類名相同
五、類的繼承和多態
5.一、類的繼承和方法覆蓋
* 繼承是對父類的擴展,子類經過繼承得到父類屬性和方法
* 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.二、封裝性和訪問修飾符
* 類(包括接口、枚舉)的訪問權限`
* public:能夠被任何其餘類使用
* 缺省訪問修飾符(不寫):只能被同一包內的類使用
* 類的成員變量訪問權限(在類中建立該類實例.訪問)
* private 只能被類自己訪問,外界只能經過該類提供的接口訪問
* 缺省 同一包內的類能夠訪問
* protected 能夠被統一包內的類和其子類訪問
* public 能夠被任何類訪問
* final修飾符的做用
* final修飾類,該類就會成爲最終類,不能被繼承
* final修飾方法,該方法就不能被子類覆蓋
* final修飾變量,該變量變爲常量,一經賦值不能更改
* final修飾參數,則該參數在方法中只能使用但不能被改變
* final修飾一個引用變量,表示該變量的引用(地址)不能改變,即不能使用該變量指向另外一個對象,但對象自己能夠改變
* 成員變量通常和static修飾符連用,構成編譯時常量,編譯器將該常量值代入任何可能使用到它的表達式中,以減輕運行時的負擔
5.三、抽象類
* 抽象類是用關鍵字abstract修飾的類,其中能夠定義抽象方法,抽象方法也使用abstract修飾,只有聲明沒有具體的實現
* 抽象類不能實例化,但能夠被聲明;抽象類的子類須要實現抽象類中的全部方法,除非子類自己也是抽象類。
* 抽象類中能夠定義非抽象方法,甚至能夠沒有抽象方法,但即便沒有抽象方法,它仍是要被一個非抽象子類繼承纔可使用
* abstract 類必須被繼承纔有意義,而final修飾的類不能被繼承,因此這兩個關鍵字不能再定義類的時候同時使用
* abstract類中有構造方法
* 對象的轉換和多態
* 繼承關係使子類繼承了父類的特性,而且能夠擴展一些新的特性,子類是父類的特殊化,子類和父類的關係是(is a)關係,子類 is a 父類
* 子類對象和父類對象在必定條件下也能夠互相轉換
* 子類能夠自由轉換成父類對象但要損失子類自己擴展的特性
* 父類對象轉換子類對象須要強制類型轉換,但在轉換以前要使用instanceof運算符判斷它指向的是否是要轉換的子類類型的對象,不然容易出現類轉換異ClassCastException
* instanceof運算符 對象 instanceof 類名 判斷這個對象是否是該類的實例
5.四、多態
* 多態就是多種形式,指Java程序中一個類或多個類中能夠定義多個同名的方法,這多個同名的方法能夠完成不一樣的操做
* 多態性是指在程序運行時判斷應該執行哪一個方法代碼的能力
* 多態分爲靜態多態(編譯時多態)和動態多態(運行時多態),前者經過方法重載實現,後者經過方法覆蓋實現
* 綁定:方法調用和方法體的關聯過程
* 前期綁定:程序執行前綁定
* 後期綁定:程序執行時綁定
* Java中除了用static和final修飾的方法外,其他都是後期綁定(動態綁定)
* 動態多態實現機制:方法的動態綁定
* 對於重載的方法,在運行時根據傳遞的參數來綁定方法體
* 在父類中聲明的方法被子類繼承,若是該方法被子類覆蓋,在子類調用該方法時會綁定子類覆蓋的方法體;
* 若是子類沒有覆蓋該方法,則經過子類調用該方法時綁定父類原有方法體
* 若是一個方法中的參數是父類,那麼該方法的參數能夠傳遞該父類的任意子類對象