面向對象的三大特性:
封裝,繼承,多態
面向對象的三大特點:
1.更符合我們平時的思維習慣
2.把複雜的問題簡單化
3.把我們從執行者變成指揮者
Java中使用類來描述事物
類:一類事物的抽象
對象:這類事物的實例(具體化)
關於封裝
體現:
1.方法的定義
2.私有成員變量
3.描述一個事物(定義一個類)
好處:
1.提高代碼的複用性
2.提高代碼的安全性
3.提高代碼的多樣性
關於私有成員變量:
用private修飾的成員變量就是私有成員變量.
private:權限修飾符 私有的
修飾:成員變量和成員方法
被修飾後 :被修飾的成員只能在本類中訪問;
關於類:
構造方法:
格式:
修飾符 類名(形式參數列表){
方法體;
}
構造方法的作用:
1.提供多種創建對象的方式
2.在創建對象的同時給對象的屬性進行賦值
3.在創建對象的同時完成某些功能(自己完成)
構造方法的特點:
1.若在一個類中不寫任何構造方法,JVM會默認給與一個無參構造方法;
2.若在一個類中寫了任意一種構造方法,JVM提供的默認無參構造就沒有;
new的過程做了哪些事情:
1.創建一個對象
2.調用了相應的構造方法
3.在堆內存中開闢了空間
創建對象的格式:
類名 對象名 = new 類名(實際參數列表);
事物描述類的編寫步驟
1.私有成員變量 -->寫屬性
2.自動生成無參構造方法
3.自動生成含參構造方法
4.自動生成getters and setters 方法
5.若該類型的事物有行爲 你可以自行的編寫相應的成員方法
事物描述類的使用
1.創建main方法(main方法不要寫在事物描述類中)
2.創建對象
3.對象調方法(對象調屬性)
關於繼承
繼承:類與類之間的關係
繼承的特點:單一繼承,多層繼承
繼承的原則:子類繼承父類,子類可以使用父類中所有非私有的成員
繼承的關鍵字: extends
繼承的格式:
public class 子類名 extends 父類名{
}
注意:當一個類沒有任何繼承關係的時候,默認繼承Object
Object:根類,基類,超類 是所有類直接或者間接的父類
繼承中成員變量的特點:
只要有對象調屬性,編譯看左邊,運行看左邊;(看的是對象,看對象裏是否有這個屬性,後者 )
-->就近原則
當局部位置有該變量,優先使用局部位置的變量
當局部位置和本類成員位置都有該變量,若要使用本類成員位置的變量: this.變量名
當局部位置,本類成員位置和父類成位置都有該變量,若要使用父類成員位置的變量: super.變量名
繼承中成員方法的特點:
只要有對象調方法,編譯看左邊,運行看右邊;(看的是對象,看對象裏是否有這個方法,或者父類裏有沒有這個方法)
-->動態綁定:
當子類中有該方法,執行子類的該方法;
若子類中沒有該方法,去父類中找該方法,若有就執行,若沒有報錯!
繼承中構造方法的特點:
子類對象要加載要優先加載父類; 原因:有可能子類對象會使用到父類的成員;
構造代碼塊:對象的預加載 -->爲對象的出生做準備
什麼時候執行:只要new對象 就優先於構造方法執行構造代碼塊
執行多少次:只要new 對象,new一次就執行一次構造代碼塊
靜態代碼塊:類的預加載 -->驅動 -->爲類的加載做準備
什麼時候執行:當這個類第一次被加載的時候執行;
執行多少次:只在類第一次被加載的時候執行一次,優先於構造代碼塊優先於構造方法;
super:本類父類對象的引用
this:本類對象的引用
this.變量名:調用本類中成員位置的該變量
this.方法名:調用本類中的某個成員方法
super.變量名:調用本類父類中成員位置的該變量
super.方法名:調用本類父類中的某個成員方法
this():調用本類中的無參構造方法,只是調用構造方法並沒有創建對象
this(實際參數):調用本類中的含參構造方法,只是調用構造方法並沒有創建對象
super():調用本類父類中的無參構造方法,只是調用構造方法並沒有創建對象
super(實際參數):調用本類父類中的含參構造方法,只是調用構造方法並沒有創建對象
super():
1.當一個類的構造方法的第一行代碼沒有調用其他任何一個構造方法,默認存在一句super();(只能在構造方法的第一句)!
2.若你在構造方法的第一句調用了任意某個本類或者父類的構造方法,默認存在的super()就不存在了!
3.一個類中一定會有一個構造方法的第一句是在調用父類的構造方法!
方法的重寫:
當子類中出現了與父類中方法聲明完全一致的情況,稱爲方法的重寫; (除了權限修飾符)
必須要求子類重寫方法:返回值類型相同,方法名相同,形式參數列表完全相同
要求:子類重寫的方法權限修飾符要大於或者等於父類的該方法
權限修飾符等級排名: public > protected > 默認不寫 > private
註解: @Override -->檢查方法是否是重寫方法 -->最好加上
關於多態
多態:事物的多種形態
多態的前提條件:
1.必須有繼承關係
2.必須有方法的重寫 -->動態綁定 (父引用調用的是子類重寫的成員方法)
3.父類引用指向子類對象
多態的格式:
父類型 父類引用 = new 子類型();
多態的成員特點:
成員變量:只要有對象調屬性,編譯看左邊,運行看左邊;
成員方法:只要有對象調方法,編譯看左邊,運行看右邊;
多態的弊端:
父類引用不能訪問子類特有的成員 我們可以通過向下轉型把父引用轉換成具體的子類對象;
多態的應用:
1.作爲容器的類型,當一個父類型的容器創建,該容器可以存儲該父類型所有子類型的對象
2.把父類型作爲方法的形式參數,當調用此方法的時候可以傳入任意的子類對象; -->這種思想:接口回調
引用數據類型間的類型轉換:
前提:必須是子父類關係
向上轉型: 子類 --> 父類
以多態的形式創建對象;
向下轉型: 父類 --> 子類
子類型 子類對象 = (子類型)父類引用;
instanceof:專門判斷繼承關係中,對象是否是屬於某個類型
格式:
對象 instanceof 類名
這個表達式的結果一定是boolean類型,一般作爲if語句的判斷,爲了避免代碼出現類型轉換異常(ClassCastException)
ClassCastException:
產生原因:兄弟類之間轉換
解決辦法:
使用關鍵字 instanceof 關鍵字提前判斷,若滿足條件再轉換
類的實例化內存圖:
這裏創建了一個Car的事物描述類,裏面定義了成員變量和成員方法.還創建了一個CarDemo,來實例化Car類,並實現Car類中的方法.
這裏,先加載了CarDemo.class到方法區,然後將main方法壓棧進棧,在棧裏開闢一塊空間,之後要實例化一個Car對象,那麼,Car.class文件加載到方法區,然後纔可以在堆內存中new一個Car,開闢一塊空間,在這個堆空間裏,加載Car類裏的成員變量,和成員方法在方法區的地址,然後調用了實例化對象的方法,c.run().
run()方法執行完後,就銷燬,然後調用c.isGas()方法,在棧內存中開闢一塊空間,給b傳入的參數是true.
由圖可以看出成員方法是通過地址來找到的,每new一個對象,就會在堆中創造一塊空間,加載成員參數和成員方法的地址.方法一旦執行完畢,就會從棧內存中銷燬.