一叁熔、面向?qū)ο蠛兔嫦蜻^(guò)程
- 面向過(guò)程(POP床牧,Procedure Oriented Programming)
強(qiáng)調(diào)的是功能行為,以函數(shù)為最小單位心软,考慮怎么做删铃。 - 面向?qū)ο螅∣OP踏堡,Object Oriented Programming)
將功能封裝進(jìn)對(duì)象,強(qiáng)調(diào)具備了功能的對(duì)象诫隅,以類(lèi)/對(duì)象為最小單位,考慮誰(shuí)來(lái)做挤渔。程序員從面向過(guò)程的執(zhí)行者轉(zhuǎn)化成面向?qū)ο蟮闹笓]者风题。
二沛硅、面向?qū)ο蟮娜筇卣?/h2>
1.封裝
我們程序設(shè)計(jì)追求“高內(nèi)聚,低耦合”擂红。
- 高內(nèi)聚 :類(lèi)的內(nèi)部數(shù)據(jù)操作細(xì)節(jié)自己完成昵骤,不允許外部干涉肯适;
- 低耦合 :僅對(duì)外暴露少量的方法用于使用。
隱藏對(duì)象內(nèi)部的復(fù)雜性蹦玫,只對(duì)外公開(kāi)簡(jiǎn)單的接口樱溉。便于外界調(diào)用纬凤,從而提高系統(tǒng)的可擴(kuò)展性、可維護(hù)性肚医。通俗的說(shuō)肠套,把該隱藏的隱藏起來(lái)猖任,該暴露的暴露出來(lái)。這就是封裝性的設(shè)計(jì)思想搁痛。
2.繼承
- 為什么要有繼承宇弛?
多個(gè)類(lèi)中存在相同屬性和行為時(shí),將這些內(nèi)容抽取到單獨(dú)一個(gè)類(lèi)中彻况,那么多個(gè)類(lèi)無(wú)需再定義這些屬性和行為纽甘,只要繼承那個(gè)類(lèi)即可抽碌。
此處的多個(gè)類(lèi)稱(chēng)為子類(lèi)( 派生類(lèi)),單獨(dú)的這個(gè)類(lèi)稱(chēng)為父類(lèi)(基類(lèi)或超類(lèi))左权。
可以理解為:“子類(lèi) is a 父類(lèi)” - 類(lèi)繼承語(yǔ)法規(guī)則:
class Subclass extends SuperClass{ } - 作用:
繼承的出現(xiàn)減少了代碼冗余涮总,提高了代碼的復(fù)用性祷舀。
繼承的出現(xiàn)裳扯,更有利于功能的擴(kuò)展饰豺。
繼承的出現(xiàn)讓類(lèi)與類(lèi)之間產(chǎn)生了關(guān)系允蜈,提供了多態(tài)的前提饶套。
注意:不要僅為了獲取其他類(lèi)中某個(gè)功能而去繼承
3.多態(tài)
多態(tài)性,是面向?qū)ο笾凶钪匾母拍睢?br> 對(duì)象的多態(tài)性:父類(lèi)的引用指向子類(lèi)的對(duì)象 怠李。可以直接應(yīng)用在抽象類(lèi)和接口上夷蚊。
-
多態(tài)作用
提高了代碼的通用性惕鼓,常稱(chēng)作接口重用 -
前提
1.需要存在繼承或者實(shí)現(xiàn)關(guān)系
2.有方法的重寫(xiě) -
成員方法
編譯時(shí):要查看引用變量所聲明的類(lèi)中是否有所調(diào)用的方法唐础。
運(yùn)行時(shí):調(diào)用實(shí)際new的對(duì)象所屬的類(lèi)中的重寫(xiě)方法彻犁。 -
成員變量
不具備多態(tài)性,只看引用變量所聲明的類(lèi)驼鹅。 -
編譯時(shí)類(lèi)型和運(yùn)行時(shí)類(lèi)型
Java引用變量有兩個(gè)類(lèi)型: 編譯時(shí)類(lèi)型和運(yùn)行時(shí)類(lèi)型森篷。編譯時(shí)類(lèi)型由聲明該變量時(shí)使用的類(lèi)型決定,運(yùn)行時(shí)類(lèi)型由實(shí)際賦給該變量的對(duì)象決定买乃。簡(jiǎn)稱(chēng):編譯時(shí)剪验,看左邊前联;運(yùn)行時(shí),看右邊啸臀。
若編譯時(shí)類(lèi)型和運(yùn)行時(shí)類(lèi)型不一致 烁落, 就出現(xiàn)了對(duì)象的多態(tài)性 (Polymorphism)
多態(tài)情況下 :
“ 看左邊 ” ,看的是父類(lèi)的引用(父類(lèi)中不具備子類(lèi)特有的方法)
“ 看右邊 ” 灯萍,看的是子類(lèi)的對(duì)象(實(shí)際運(yùn)行的是子類(lèi)重寫(xiě)父類(lèi)的方法)
注意:一個(gè)引用類(lèi)型變量如果聲明為父類(lèi)的類(lèi)型寸谜,但實(shí)際引用的是子類(lèi)對(duì)象,那么該變量就不能再訪問(wèn)子類(lèi)中添加的屬性和方法他爸。
舉例:
Student m = new Student();
m.school = “pku”; // 合法,Student 類(lèi)有school 成員變量
Person e = new Student();
e.school = “pku”; // 非法,Person 類(lèi)沒(méi)有school 成員變量
屬性是在編譯時(shí)確定的诊笤,編譯時(shí)e 為Person 類(lèi)型,沒(méi)有school 成員變量讨跟,因而編譯錯(cuò)誤晾匠。
-
靜態(tài)綁定和動(dòng)態(tài)綁定(早綁定和晚綁定)
對(duì)于重載而言,在方法調(diào)用之前薪寓,編譯器就已經(jīng)確定了所要調(diào)用的方法澜共,這稱(chēng)為“早綁定”或“靜態(tài)綁定”;
而對(duì)于多態(tài)母谎,只有等到方法調(diào)用的那一刻奇唤,解釋運(yùn)行器才會(huì)確定所要調(diào)用的具體方法匹摇,這稱(chēng)為“晚綁定”或“動(dòng)態(tài)綁定”。
引用一句Bruce Eckel的話:“不要犯傻,如果它不是晚綁定演顾,它就不是多態(tài)「鹋埃”
子類(lèi)中定義了與父類(lèi)同名同參數(shù)的方法棉钧,在多態(tài)情況下,將此時(shí)父類(lèi)的方法稱(chēng)為虛擬方法万栅,父類(lèi)根據(jù)賦給它的不同子類(lèi)對(duì)象西疤,動(dòng)態(tài)調(diào)用屬于子類(lèi)的該方法代赁。這樣的方法調(diào)用在編譯期是無(wú)法確定的。
Person e = new Student();
e.getInfo(); // 調(diào)用Student 類(lèi)的getInfo() 方法
編譯時(shí)e 為Person 類(lèi)型徒役,而方法的調(diào)用是在運(yùn)行時(shí)確定的窖壕,所以調(diào)用的是Student類(lèi)的getInfo() 方法艇拍,此即為動(dòng)態(tài)綁定。 -
對(duì)象類(lèi)型轉(zhuǎn)換
1.基本數(shù)據(jù)類(lèi)型的轉(zhuǎn)換
自動(dòng)類(lèi)型轉(zhuǎn)換:小的數(shù)據(jù)類(lèi)型可以自動(dòng)轉(zhuǎn)換成大的數(shù)據(jù)類(lèi)型
如long g=20; double d=12.0f
強(qiáng)制類(lèi)型轉(zhuǎn)換:可以把大的數(shù)據(jù)類(lèi)型強(qiáng)制轉(zhuǎn)換成小的數(shù)據(jù)類(lèi)型
如 float f=(float)12.0; int a=(int)1200L
2.引用數(shù)據(jù)類(lèi)型的轉(zhuǎn)換
從子類(lèi)到父類(lèi)的類(lèi)型轉(zhuǎn)換可以自動(dòng)進(jìn)行
從父類(lèi)到子類(lèi)的類(lèi)型轉(zhuǎn)換必須通過(guò)造型( 強(qiáng)制類(lèi)型轉(zhuǎn)換) 實(shí)現(xiàn)
ps:
1)對(duì)Java 對(duì)象的強(qiáng)制類(lèi)型轉(zhuǎn)換稱(chēng)為造型
2)在造型前可以使用instanceof進(jìn)行判斷
3)無(wú)繼承關(guān)系的引用類(lèi)型間的轉(zhuǎn)換是非法的
對(duì)象類(lèi)型轉(zhuǎn)換.png -
instanceof 操作符
x instanceof A :檢驗(yàn)x 是否為類(lèi)A 的對(duì)象层释,返回值為boolean 型贡羔。
注意:要求x所屬的類(lèi)與類(lèi)A必須是子類(lèi)和父類(lèi)的關(guān)系个初,否則編譯錯(cuò)誤。
舉例:
public class Person extends Object {…}
public class Student extends Person {…}
public class Graduate extends Person {…}
public void method(Person e) {
if (e instanceof Person)
// 處理Person 類(lèi)及其子類(lèi)對(duì)象
if (e instanceof Student)
// 處理Student 類(lèi)及其子類(lèi)對(duì)象
if (e instanceof Graduate)
// 處理Graduate 類(lèi)及其子類(lèi)對(duì)象
}