1.封裝
封裝的定義:
首先是抽象子房,把事物抽象成一個類形用,其次才是封裝,將事物擁有的屬性和動作隱藏起來证杭,只保留特定的方法與外界聯(lián)系田度,封裝,也就是把客觀事物封裝成抽象的類解愤,并且類可以把自己的數(shù)據(jù)和方法只讓可信的類或者對象操作镇饺,對不可信的進(jìn)行信息隱藏。
為什么需要封裝:
封裝符合面向?qū)ο笤O(shè)計(jì)原則的第一條:單一性原則送讲,一個類把自己該做的事情封裝起來奸笤,而不是暴露給其他類去處理,當(dāng)內(nèi)部的邏輯發(fā)生變化時哼鬓,外部調(diào)用不用因此而修改监右,他們只調(diào)用開放的接口,而不用去關(guān)心內(nèi)部的實(shí)現(xiàn)
2. 繼承
Java的類可以分為三類:
類:使用class定義异希,沒有抽象方法
抽象類:使用abstract class定義健盒,可以有也可以沒有抽象方法
接口:使用inerface定義,只能有抽象方法
在這三個類型之間存在如下關(guān)系:
類可以extends:類称簿、抽象類(必須實(shí)現(xiàn)所有抽象方法)扣癣,但只能extends一個,可以implements多個接口(必須實(shí)現(xiàn)所有接口方法)
抽象類可以extends:類予跌,抽象類(可全部、部分善茎、或者完全不實(shí)現(xiàn)父類抽象方法)券册,可以implements多個接口(可全部、部分、或者完全不實(shí)現(xiàn)接口方法)
接口只能extends一個接口
繼承以后子類可以得到什么:
子類擁有父類非private的屬性和方法烁焙;子類可以添加自己的方法和屬性航邢,即對父類進(jìn)行擴(kuò)展
子類可以重新定義父類的方法,即多態(tài)里面的覆蓋
關(guān)于構(gòu)造函數(shù):
構(gòu)造函數(shù)不能被繼承骄蝇,子類可以通過super()顯示調(diào)用父類的構(gòu)造函數(shù)
創(chuàng)建子類時膳殷,編譯器會自動調(diào)用父類的 無參構(gòu)造函數(shù)
如果父類沒有定義無參構(gòu)造函數(shù),子類必須在構(gòu)造函數(shù)的第一行代碼使用super()顯示調(diào)用
類默認(rèn)擁有無參構(gòu)造函數(shù)九火,如果定義了其他有參構(gòu)造函數(shù)赚窃,則無參函數(shù)失效,所以父類沒有定義無參構(gòu)造函數(shù)岔激,不是指父類沒有寫無參構(gòu)造函數(shù)勒极。為什么需要繼承:
代碼重用是一點(diǎn),最重要的還是所謂向上轉(zhuǎn)型虑鼎,即父類的引用變量可以指向子類對象,這是Java面向?qū)ο笞钪匾匦远鄳B(tài)的基礎(chǔ)。
3. 多態(tài)
在了解多態(tài)之前补箍,首先需要知道方法的唯一性標(biāo)識即什么是相同/不同的方法:
一個方法可以由:修飾符如public斯够、static+返回值+方法名+參數(shù)+throw的異常 5部分構(gòu)成
其中只有方法名和參數(shù)是唯一性標(biāo)識,意即只要方法名和參數(shù)相同那他們就是相同的方法
所謂參數(shù)相同江兢,是指參數(shù)的個數(shù)昨忆,類型,順序一致划址,其中任何一項(xiàng)不同都是不同的方法
何謂重載:
重載是指一個類里面(包括父類的方法)存在方法名相同扔嵌,但是參數(shù)不一樣的方法,參數(shù)不一樣可以是不同的參數(shù)個數(shù)夺颤、類型或順序
如果僅僅是修飾符痢缎、返回值、throw的異常 不同世澜,那這是2個相同的方法独旷,編譯都通不過,更不要說重載了
何謂覆蓋/重寫:覆蓋描述存在繼承關(guān)系時子類的一種行為
子類中存在和父類相同的方法即為覆蓋寥裂,何謂相同方法請牢記前面的描述嵌洼,方法名和參數(shù)相同,包括參數(shù)個數(shù)封恰、類型麻养、順序
覆蓋/重寫的規(guī)則:
子類不能覆蓋父類private的方法,private對子類不可見诺舔,如果子類定義了一個和父類private方法相同的方法鳖昌,實(shí)為新增方法
重寫方法的修飾符一定要大于被重寫方法的修飾符(public > protected > default > private)
重寫拋出的異常需與父類相同或是父類異常的子類备畦,或者重寫方法干脆不寫throws
重寫方法的返回值必須與被重寫方法一致,否則編譯報錯
靜態(tài)方法不能被重寫為非靜態(tài)方法许昨,否則編譯出錯
多態(tài)可以說是“一個接口懂盐,多種實(shí)現(xiàn)”或者說是父類的引用變量可以指向子類的實(shí)例,被引用對象的類型決定調(diào)用誰的方法糕档,但這個方法必須在父類中定義
多態(tài)可以分為兩種類型:編譯時多態(tài)(方法的重載)和運(yùn)行時多態(tài)(繼承時方法的重寫)莉恼,編譯時多態(tài)很好理解,后述內(nèi)容針對運(yùn)行時多態(tài)
運(yùn)行時多態(tài)依賴于繼承速那、重寫和向上轉(zhuǎn)型
向上轉(zhuǎn)型的缺憾:只能調(diào)用父類中定義的屬性和方法俐银,對于子類中的方法和屬性它就望塵莫及了,必須強(qiáng)轉(zhuǎn)成子類類型
總結(jié)概括:
當(dāng)超類對象引用變量引用子類對象時琅坡,被引用對象的類型而不是引用變量的類型決定了調(diào)用誰的成員方法悉患,但是這個被調(diào)用的方法必須是在超類中定義過的,也就是說被子類覆蓋的方法榆俺,但是它仍然要根據(jù)繼承鏈中方法調(diào)用的優(yōu)先級來確認(rèn)方法售躁,該優(yōu)先級為:this.show(O)、super.show(O)茴晋、this.show((super)O)陪捷、super.show((super)O)