Java基础点——面向对象(中)
雖然沒人看,但是也整理一下。這些都是個人重新復(fù)習(xí)java覺得需要注意的小知識點。
繼承性
a) class Students extends Person(){}
b) 子類:派生類 subclass
c) 父類:超類,基類,superclass
d) 一旦子類A繼承父類B以后,子類A中就獲取了父類B中聲明的結(jié)構(gòu):屬性和方法?包括父類的私有結(jié)構(gòu)
繼承的規(guī)定
a) 只支持單繼承和多層繼承,不允許多重繼承
b) 一個類只能有一個父類
c) 可以通過接口interface進(jìn)行擴(kuò)展
Object類和功能
a) Java.lang.Object類是所有的類的父類或者間接父類
Java assert()斷言關(guān)鍵字
a) 1、assert condition; .assert需要顯示的開啟生效才有作用。
這里condition是一個必須為真(true)的表達(dá)式。如果表達(dá)式的結(jié)果為true,那么斷言為真,并且無任何行動
如果表達(dá)式為false,則斷言失敗,則會拋出一個AssertionError對象。這個AssertionError繼承于Error對象,
而Error繼承于Throwable,Error是和Exception并列的一個錯誤對象,通常用于表達(dá)系統(tǒng)級運行錯誤。
方法的重寫(overwrite) ? 區(qū)分方法的重載(一個類中可以有多個不同參數(shù)列表的方法)
a) 在子類中,可以根據(jù)需要對父類中繼承來的方法來進(jìn)行改造,也稱為方法的重置、覆蓋。在程序執(zhí)行的時候,子類的方法將父類的方法覆蓋。
b) 要求
i. 子類的方法名必須 和父類被重寫的方法具有相同的名字和參數(shù)列表。
ii. 子類不可以降低可見性 ? 權(quán)限修飾符必須大于父類
iii. 特殊情況:父類中的private方法?無法被重寫
iv. 返回值類型:
Void:若父類為void 子類一定是void
若父類的返回值為A類 子類可以返回A類或者A類的子類
若父類為基本數(shù)據(jù)類型(基本數(shù)據(jù)類型 無子類),則子類只能使用相同的。
v. 子類重寫的方法拋出的異常類型 不大于 父類的異常類型
vi. 若非static?可以被重寫,若子類和父類都聲明為static,不是重寫!!
四種權(quán)限修飾
a) Private: 同一個類中,不可以在同一個包中其他的類調(diào)用
b) 缺省:同一個包
c) Protected:同一個包中,不同的包不能使用,除非是不同包的子類調(diào)用
d) Public 同一個工程
Super關(guān)鍵字的使用
a) 理解為:父類的
b) 子類重寫了父類的方法后,可以使用super關(guān)鍵字再次使用父類的方法
c) 默認(rèn)調(diào)用子類的屬性和方法,若想要調(diào)用父類的,使用super修飾
d) Super調(diào)用構(gòu)造器:
i. 在子類構(gòu)造器中使用super(形參列表),調(diào)用父類中聲明的指定的構(gòu)造器
ii. 構(gòu)造器中:Super(形參)必須聲明在子類構(gòu)造器的首行,
iii. This()和super()不能同時出現(xiàn)
iv. 子類構(gòu)造器首行若沒有顯式this()super() 默認(rèn)使用父類的空參構(gòu)造器
v. 因為子類構(gòu)造器默認(rèn)要有this()或者super()
所以若子類沒有顯示this()super() || 父類沒有空構(gòu)造器,子類必須完善父類的有參數(shù)構(gòu)造器
vi. 類的多個構(gòu)造器中,至少有一個使用了super()構(gòu)造器
子類對象實例化的過程
a) 結(jié)果看:子類繼承父類之后,獲得父類的方法和屬性,在堆空間(heap)中,會加載所有父類的屬性
b) 過程來看:子類構(gòu)造器創(chuàng)建子類對象時,會直接和間接的調(diào)用父類的構(gòu)造器,直到掉用到Object中的空參的構(gòu)造器為止—>所以子類才可以調(diào)用屬性和方法
面相對象的第三個屬性:多態(tài)性polymorphism—>只適用于方法,不適用于屬性
a) 一個事務(wù)的多種形態(tài)
b) 父類的引用指向子類的對象 Person per = new man();
c) 當(dāng)調(diào)用子類和父類同名參數(shù)的方法時,實際執(zhí)行的是子類重寫父類的方法—虛擬方法調(diào)用
d) 但是無法調(diào)用子類的特有方法
e) 編譯器?只能調(diào)用父類中(左邊)申明的方法,實際執(zhí)行子類重寫的方法(右邊)
f) 編譯看左邊;運行放右邊
g) 例:使用父類的引用,調(diào)用不同類型數(shù)據(jù)庫的方法
i. 方法 public void doData(Connection con){}
ii. 調(diào)用 public void doData(new MySQLConnection){}
iii. 這個例子中,方法參數(shù)的類Connection,可以根據(jù)傳入的不同的子類而使用不同子類的函數(shù),來操作不同類型的數(shù)據(jù)庫
多態(tài)特點
a) 多態(tài)是運行時行為,屬于動態(tài)綁定。只有方法調(diào)用的那一刻,解釋運行期interpreter才知道所調(diào)用的具體方法,也成為后綁定。和方法重載相反。
b) 父類的方法成為虛擬方法,父類根據(jù)賦予給他的不同的子類對象,動態(tài)調(diào)用屬于子類的該方法。這種方法調(diào)用是在編譯器無法確定的
向下轉(zhuǎn)型
a) 背景:動態(tài)綁定不能調(diào)用子類特有的屬性和方法,編譯時是父類的類型
b) 如何調(diào)用特有的:Man m1 = (Man)p2; Man是P2的子類
c) 和基礎(chǔ)數(shù)據(jù)類型對比:自動類型提升?向上轉(zhuǎn)型:多態(tài) 強(qiáng)制類型轉(zhuǎn)換—>向下轉(zhuǎn)型:使用instanceof判斷
Instanceof操作符
a) X instanceof A:檢驗x是否為類A的實例,返回值為Boolean
Object類的使用
a) 所有java的跟父類,若未使用extends來指明父類,object為默認(rèn)父類
b) 只有一個空參構(gòu)造器
c) Clone()
d) Finalize()方法的使用,可以通過system.gc()通知系統(tǒng)進(jìn)行垃圾回收,垃圾回收機(jī)制在回收對象之前,總會先調(diào)用他的finalize方法。不主動調(diào)用該方法
e) getClass()獲取對象當(dāng)前的類
f) hashCode()返回對象的hash值
g) notify(),wait() —> 線程相關(guān)
h) toString();
i) equal(Object obj);比較兩個對象是否相等
i. == 和 equal的區(qū)別
==是運算符 可以使用在基本數(shù)據(jù)類型變量和引用類型數(shù)據(jù)變量中
a) 比較基本數(shù)據(jù)類型,比較兩個變量的保存的數(shù)據(jù)是否相等。(不一定要相同的類型)
b) 比較引用數(shù)據(jù)類型:比較兩個變量的地址值是否相等,是否指向同一個對象實體
Equals()的使用
a) 是一個方法而非運算符
b) 只能適用于引用數(shù)據(jù)類型
c) Object類中的equals:return (this == obj); 和==作用相同
d) 對于String Date File 包裝類都重寫了equals()方法,比的是兩個對象的實體內(nèi)容是否相等
j) 自定義類手動實現(xiàn)重寫Object.equals()
i. 使其比較對象實體內(nèi)容而并非引用數(shù)值。
重寫時比較String使用equals!!!String s == “aa” 時,“aa”存在與常量池中
public boolean equals(Object obj){
if(this == obj){
return true;
}
if(obj instanceof CLASS){
CLASS class = (CLASS)obj//強(qiáng)制轉(zhuǎn)換
//比較兩個對象的每個屬性是否相同
if(this.name == obj.name && this.id.equals(obj.id) ){//假設(shè)id為引用數(shù)據(jù)類型,name為基本數(shù)據(jù)類型
return true;
}else
return false;
}
//return this.name == obj.name && this.id.equals(obj.id)
}
toString()方法
a) 當(dāng)輸出一個對象的引用時,就是調(diào)用該對象的toString方法,自定義類返回地址
b) String Date File 包裝類都重寫了toString方法。調(diào)用時直接返回實體內(nèi)容信息
c) 自定義類也可以重寫toString方法,返回是實體對象。
單元測試方法的使用
a) Junit單元測試,選中當(dāng)前過程
b) 創(chuàng)建java類進(jìn)行單元測試
包裝類(wrapper的使用)
a) 針對八種基本數(shù)據(jù)類型相應(yīng)的引用類型——包裝類, 使得基本數(shù)據(jù)類型也有類的特征
b) Byte, Short, Integer, Long, Float, Double—父類是Number
c) Character,Boolean
基本數(shù)據(jù)類型,包裝類,String之間的相互轉(zhuǎn)換
a) 基本數(shù)據(jù)類型與包裝類相互轉(zhuǎn)換
i. 裝箱 通過構(gòu)造器Integer I = new Integer(11); 自動裝箱
ii. 拆箱 調(diào)用包裝類方法:xxxValue() 自動拆箱
b) 基本數(shù)據(jù)類型與String
i. String類的ValueOf(3.4f) 3.4+””
ii. 調(diào)用包裝類ParseXxx(String)靜態(tài)方法 包裝類構(gòu)造器:boolean b = new Boolean(“true”);
c) 包裝類與String
i. 包裝類對象toString方法 調(diào)用包裝類toString(形參)
ii. 字符串傳參:Float f = new Float(“22.1F”);
iii. JDK:5.0新特性:自動裝箱和拆箱
iv. 對于自動裝箱
在Integer包中,定義了靜態(tài)的緩存數(shù)組范圍-128-127 IntegerCache[],方便自動裝箱
若賦值Integer a = 1;則返回靜態(tài)數(shù)組的地址(自動裝箱)
若賦值Integer a = 128;非自動裝箱,會new一個對象
總結(jié)
以上是生活随笔為你收集整理的Java基础点——面向对象(中)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win8音频服务器未响应,大神为你详解w
- 下一篇: Java基础点:常用类