面向?qū)ο蠡A(chǔ)
大家好, 我是鹿是不是鹿, 下面是為大家精選的一些面向?qū)ο蠡A(chǔ)知識, 希望能給大家?guī)硖嵘?/p>
1.1??面向?qū)ο?/h1>1.1.1?????概念
所謂的面向?qū)ο笫且环N編程思想,通過這種思想可以把生活中的復雜事情變得簡單化,從原來的執(zhí)行者變成了指揮者,面向?qū)ο笫腔诿嫦蜻^程而言的。
我們經(jīng)常說的面向?qū)ο蟮木幊虒崿F(xiàn)(OOP,Object Oriented Programming)
?
l??面向過程強調(diào)的是過程,例如:
1、打開冰箱?2、把大象放進去???3、關(guān)上冰箱
l??面向?qū)ο髲娬{(diào)結(jié)果,例如:
1、?餓了,去平臺點餐,這個動作就是面向?qū)ο?。你沒有去市場買菜洗菜做飯。。。只要有app就可以了。
2、?衣服臟了,直接甩給女票去處理等著穿干凈的就可以了。你沒有關(guān)注中間的過程。。只要找好對象就可以了。
3、面試官問什么是面向?qū)ο螅磕愦鹑f物皆對象?。〔唤ㄗh因為你還沒到這個深度,最好舉例。就像是,你說空即是色色即是空—信你個鬼。
?
1.1.2?????三大特征
1、?封裝性,把相關(guān)的數(shù)據(jù)封裝成一個“類”組件
2、?繼承性,是子類自動共享父類屬性和方法,這是類之間的一種關(guān)系
3、?多態(tài),增強軟件的靈活性和重用性
1.2??類和對象
1.2.1?????類
1、?Java語言最基本單位就是類,類似于類型。
2、?類是一類事物的抽象。
3、?可以理解為模板或者設(shè)計圖紙。
1.2.2?????對象
每個對象具有三個特點:對象的狀態(tài),對象的行為和對象的標識。
1、?對象的狀態(tài)用來描述對象的基本特征。
2、?對象的行為用來描述對象的功能。
3、?對象的標識是指對象在內(nèi)存中都有一個唯一的地址用來和其他對象區(qū)分開來。
4、?類是一類事物的抽象,對象是具體的實現(xiàn)。
1.2.3?????類和對象的關(guān)系
1、?計算機語言是用來描述現(xiàn)實世界事物的。屬性+行為
2、?那怎么通過java語言描述呢?通過類來描述事物,把事物的屬性當做成員變量,把行為當做成員方法。
分析手機事物:
屬性:顏色,尺寸,品牌,價格。。。
方法:打電話,發(fā)短信,聽音樂。。。。
類:手機類,抽取相同的屬性和行為
對象:可以按照模板生產(chǎn)很多個手機,比如1號手機對象,包含特有的成員變量和成員方法

1.3??類和對象的創(chuàng)建和使用
1.3.1?????練習1:類的創(chuàng)建使用
通過class關(guān)鍵字創(chuàng)建類,通過new關(guān)鍵字創(chuàng)建對象。
1.3.2?????對象在內(nèi)存中的存儲
Java把內(nèi)存分成5大區(qū)域,我們重點關(guān)注棧和堆。

1、?一般來講局部變量存在棧中,方法執(zhí)行完畢內(nèi)存就被釋放
2、?對象(new出來的東西)存在堆中,對象不再被使用時,內(nèi)存才會被釋放
3、?每個堆內(nèi)存的元素都有地址值
4、?對象中的屬性都是有默認值的
1.3.3?????單一對象內(nèi)存圖
Person p = new Person();

1、?在棧內(nèi)存中,創(chuàng)建一個引用變量p,持有對象的地址值
2、?在堆內(nèi)存中,創(chuàng)建Person對象,并且開辟變量的空間,完成初始化
3、?給堆內(nèi)存中的元素,分配一個唯一標志,地址值。交給p去保存。
4、?p.name=”lisi”;p.age=20;就去堆內(nèi)存中找唯一的地址值,找到Person對象,并對其屬性進行修改賦值。
5、?p.eat();就去堆內(nèi)存中找唯一的地址值,找到Person對象,執(zhí)行Person對象的方法。
1.3.4?????練習2:創(chuàng)建多個類
1.3.5?????多對象內(nèi)存圖

1、?變量p和變量p1不是一片空間,p1需要開辟新的空間
2、?Person p1=new Person,這時只要有new,就會新開辟空間在堆內(nèi)存中存入對象。
1.4??封裝
1.4.1?????概述
封裝是指隱藏對象的屬性和實現(xiàn)細節(jié),僅僅對外提供公共的訪問方式。
好處:
1、?提高安全性
2、?提高重用性
案例:
1、?類
2、?方法
1.4.2?????private關(guān)鍵字
是一個權(quán)限修飾符,用于修飾成員變量和成員函數(shù),被私有化的成員只能在本類中訪問。
想要修改只能,對外提供公共的,get和set方法。
1.4.3?????練習1:封裝學生
先用不同的變量名,不要出現(xiàn)this
1.5??拓展
1.5.1?????創(chuàng)建Teacher類,并創(chuàng)建Teacher對象測試
老師事物:設(shè)置特性和功能
特征:姓名、年齡、住址
功能:講課
?
測試:
創(chuàng)建Teacher對象
調(diào)用老師的屬性和功能
修改老師的屬性
?
1.5.2?????編寫汽車類并畫內(nèi)存圖
屬性:顏色,型號,品牌,價格
行為:開,飛。。。
汽車對象的創(chuàng)建和使用
1.5.3?????創(chuàng)建對象的流程
Person p = new Person();//短短這行代碼發(fā)生了很多事情
1.??????把Person.class文件加載進內(nèi)存
2.??????在棧內(nèi)存中,開辟空間,存放變量p
3.??????在堆內(nèi)存中,開辟空間,存放Person對象
4.??????對成員變量進行默認的初始化
5.??????對成員變量進行顯示初始化
6.??????執(zhí)行構(gòu)造方法(如果有構(gòu)造代碼塊,就先執(zhí)行構(gòu)造代碼塊再執(zhí)行構(gòu)造方法)
7.??????堆內(nèi)存完成
8.??????把堆內(nèi)存的地址值賦值給變量p?,p就是一個引用變量,引用了Person對象的地址值
1.5.4?????匿名對象
沒有名字的對象,是對象的簡化表示形式。
使用場景:
1、?當被調(diào)用的對象只調(diào)用一次時(多次會創(chuàng)建多個對象浪費內(nèi)存)
Demo d = new Demo();
d.sleep();
d.game();
//這個d就是對象的名字。
也可以寫成:
new Demo().show();//創(chuàng)建了一個對象調(diào)方法
new Demo().game();//又創(chuàng)建了一個對象調(diào)方法
2.1??構(gòu)造方法
2.1.1?????概念
構(gòu)造方法是一種特殊的方法,它是一個與類同名且返回值類型為同名類類型的方法。對象的創(chuàng)建就是通過構(gòu)造方法來完成,其功能主要是完成對象的創(chuàng)建或者對象的初始化。當類實例化一個對象時會自動調(diào)用構(gòu)造方法。
構(gòu)造方法和其他方法一樣也可以重載。
2.1.2?????形式
可以無參也可以有參
修飾符??類名(【參數(shù)】){
???????代碼……
}
2.1.3?????練習1:構(gòu)造方法創(chuàng)建對象
創(chuàng)建對象時的兩種方法
2.1.4?????練習2:構(gòu)造方法賦值
2.2??構(gòu)造代碼塊和局部代碼塊
2.2.1?????構(gòu)造代碼塊
1、?在類的內(nèi)部,方法外部,的代碼塊。
2、?通常用于抽取構(gòu)造方法中的共性代碼。
3、?每次調(diào)用構(gòu)造方法前都會調(diào)用構(gòu)造代碼塊
4、?優(yōu)先于構(gòu)造方法加載
2.2.2?????局部代碼塊
1、?在方法里面的代碼塊
2、?通常用于控制變量的作用范圍,出了括號就失效
3、?變量的范圍越小越好,成員變量會有線程安全問題
4、??總結(jié):執(zhí)行順序:
構(gòu)造代碼塊是最優(yōu)先的,局部代碼塊順序執(zhí)行
2.2.3?????練習1:代碼塊加載順序
2.3??this關(guān)鍵字
2.3.1?????概念
this代表本類對象的一個引用對象。
構(gòu)造函數(shù)中,this()必須放在第一行。
2.3.2?????形式
//name=name;
//age=age;
其實是想把Student類的局部變量name的值賦值給成員變量,相當于你想操作是這樣的:
//Student.name=name;
但是你不能直接寫類名,這時候就用代表本類的對象this來完成。代碼變成了:
this.name=name;
2.3.3?????練習1:當變量名相同時
當局部變量和成員變量同名時,用于區(qū)分。
如果附近有同名變量,會遵從變量的就近原則,那么怎么調(diào)用成員變量呢?
2.3.4?????練習2:構(gòu)造方法間的調(diào)用
2.4??繼承
2.4.1?????概念
繼承是面向?qū)ο笞铒@著的一個特性。
繼承是從已有的類中派生出新的類,新的類能吸收已有類的數(shù)據(jù)屬性和行為,并能擴展新的能力。
Java繼承是使用已存在的類的定義作為基礎(chǔ)建立新類的技術(shù),新類的定義可以增加新的數(shù)據(jù)或新的功能,也可以用父類的功能,但不能選擇性地繼承父類/超類/基類。
這種技術(shù)使得復用以前的代碼非常容易,能夠大大縮短開發(fā)周期,降低開發(fā)費用。
提高復用性:只要繼承父類,就能有一樣的功能
class A extends c{??//原來的eat()拿走了???}
class B extends c{??//原來的eat()拿走了??}
class c{
????public void eat(){
???????syso("eat");
????}
}
2.4.2?????特點
1、?使用extends關(guān)鍵字
2、?相當于子類把父類的功能復制了一份
3、?java只支持單繼承
4、?繼承可以傳遞(爺爺,兒子,孫子的關(guān)系)
5、?不能繼承父類的私有成員
6、?繼承多用于功能的修改,子類可以擁有父類的功能的同時,進行功能拓展
7、?像是is a?的關(guān)系
2.4.3?????入門案例
2.5??super關(guān)鍵字
1、?通過super關(guān)鍵字可以使用父類的內(nèi)容
2、?super代表父類的一個引用對象
3、?如果用,必須出現(xiàn)在調(diào)用位置的第一行
2.6??方法的重寫
1、?繼承后,子類就擁有了父類的功能
2、?那么在子類中,可以添加子類特有的功能也可以修改父類的原有功能
3、?子類中方法簽名與父類完全一樣(包括方法的返回值,方法名和參數(shù)列表,完全一致)時,會發(fā)生覆蓋/復寫操作,相當于修改功能
注意:
1、父類中的私有方法不能被重寫
2、子類重寫父類方法時,修飾符要大于等于父類修飾符的權(quán)限
2.7??繼承中的用法
2.7.1?????成員變量的使用
局部的,成員的,父類的。
2.7.2?????成員方法的使用
2.7.3?????構(gòu)造方法的使用
1、?子類創(chuàng)建對象時,默認會去訪問父類的無參構(gòu)造方法
2、?在構(gòu)造方法的第一行,都有一條默認的語句:super();
3、?父類沒有無參構(gòu)造時,可以用super調(diào)用父類的其他構(gòu)造
2.8??拓展
2.8.1?????this和super的區(qū)別
1、?this代表本類對象的引用,super代表父類對象的引用。
2、?this用于區(qū)分局部變量和成員變量
3、?super用于區(qū)分本類變量和父類變量
4、?this.成員變量??this.成員方法()??this(【參數(shù)】)代表調(diào)用本類內(nèi)容
5、?super.成員變量??super.成員方法()??super(【參數(shù)】),代表調(diào)用父類內(nèi)容
6、?this和super不可以同時出現(xiàn)在同一個構(gòu)造方法里,他們兩個只要出現(xiàn)都得放在第一行,同時出現(xiàn)的話,到底第一行放誰呢。。
2.8.2?????重寫與重載的區(qū)別(Overload和Override的區(qū)別)
1、重載:是指同一個類中的多個方法具有相同的名字,但這些方法具有不同的參數(shù)列表,即參數(shù)的數(shù)量或參數(shù)類型不能完全相同
2、重寫:是存在子父類之間的,子類定義的方法與父類中的方法具有相同的方法名字,相同的參數(shù)表和相同的返回類型
3、重寫是父類與子類之間多態(tài)性的一種表現(xiàn)
4、重載是一類中多態(tài)性的一種表現(xiàn)
2.8.3?????繼承的內(nèi)存結(jié)構(gòu)

3.1??static
3.1.1?????概念
1、?是java中的一個關(guān)鍵字
2、?用于修飾成員(成員變量和成員方法)
3.1.2?????特點
1、?可以修飾成員變量,成員方法
2、?隨著類的加載而加載,優(yōu)先于對象加載
3、?只加載一次,就會一直存在,不再開辟新空間
4、?全局唯一,全局共享
5、?可以直接被類名調(diào)用
6、?靜態(tài)只能調(diào)用靜態(tài),非靜態(tài)可以隨意調(diào)用
7、?static不能和this或者super共用,因為有static時可能還沒有對象
3.1.3?????練習1:入門案例
3.1.4?????靜態(tài)方法內(nèi)存圖

3.1.5?????練習2:靜態(tài)調(diào)用關(guān)系
靜態(tài)只能調(diào)用靜態(tài)(變量或者方法),非靜態(tài)可以訪問所有的不管是不是靜態(tài)
3.2??靜態(tài)代碼塊、構(gòu)造代碼塊、局部代碼塊
3.2.1?????靜態(tài)代碼塊
隨著類的加載而加載,并且只被加載一次,一般用于項目的初始化
static{…}
3.2.2?????概述
1、?靜態(tài)代碼塊:在類加載時就加載,并且只被加載一次,一般用于項目的初始化
2、?構(gòu)造代碼塊:在調(diào)用構(gòu)造方法前會自動調(diào)用,每次創(chuàng)建對象都會被調(diào)用
3、?局部代碼塊:方法里的代碼塊,方法被調(diào)用時才會執(zhí)行
4、?靜態(tài)代碼塊:static{???},位置:在類里方法外
5、?TODO創(chuàng)建測試類,類中寫好靜態(tài)代碼塊,構(gòu)造代碼塊,構(gòu)造方法,普通方法里嵌套局部代碼塊。測試他們的執(zhí)行順序。
6、?靜態(tài)?-?構(gòu)造代碼塊?-?構(gòu)造方法?-?局部
3.2.3?????測試
3.3??final
3.3.1?????概念
1、?是java提供的一個關(guān)鍵字
2、?final是最終的意思
3、?final可以修飾類,方法,成員變量
初衷是因為:java出現(xiàn)了繼承后,子類可以更改父類的功能,當父類功能不許子類改變時可以利用final關(guān)鍵字修飾父類。
3.3.2?????特點
1、?被final修飾的類,不能被繼承
2、?被final修飾的方法,不能被重寫
3、?被final修飾的變量是個常量,值不能被更改
4、?常量的定義形式:?final?數(shù)據(jù)類型 常量名?=?值
3.3.3?????入門案例
3.4??多態(tài)
3.4.1?????概念
多態(tài)指同一個實體同時具有多種形式。它是面向?qū)ο蟪绦蛟O(shè)計(OOP)的一個重要特征。
主要是指同一個對象,在不同時刻,代表的對象不一樣,指的是對象的多種形態(tài)。
好處是可以把不同的子類對象都當作父類來看,可以屏蔽不同子類對象之間的差異,寫出通用的代碼,做出通用的編程,統(tǒng)一調(diào)用標準。
例如:水,在不同時刻可以有多種形態(tài),包括水蒸氣,冰,水。
Java怎么體現(xiàn)多態(tài)呢?狗有兩種形態(tài):狗和小動物
class Animal
class Dog extends Animal
Dog d = new Dog();//狗是狗
Animal??a=new Dog();//狗是小動物,創(chuàng)建了狗的對象,賦值給動物對象,這就是多態(tài)
3.4.2?????特點
1、?多態(tài)的前提是繼承
2、?要有方法的重寫
3、?父類引用指向子類對象,如:Animal a = new Dog(); --?小到大,向上轉(zhuǎn)型
4、?多態(tài)中,編譯看左邊,運行看右邊
3.4.3?????入門案例
3.5??多態(tài)的好處
1、???多態(tài)可以讓我們不用關(guān)心某個對象到底是什么具體類型,就可以使用該對象的某些方法。
2、???提高了程序的擴展性和可維護性
3.6??多態(tài)的使用
3.6.1?????特點
1、成員變量:使用的是父類的
2、成員方法:由于存在重寫現(xiàn)象所以使用的是子類的
3、靜態(tài)成員:隨著對象而存在,誰調(diào)用的就返回誰的
3.6.2?????測試
3.7??拓展
3.7.1?????靜態(tài)代碼塊,構(gòu)造代碼塊,局部代碼塊
!?。?zhí)行順序:靜態(tài)代碼塊—構(gòu)造代碼塊—構(gòu)造函數(shù)
7、?靜態(tài)代碼塊:在類加載時就加載,并且只被加載一次,一般用于項目的初始化
8、?構(gòu)造代碼塊:在創(chuàng)建對象時會自動調(diào)用,每次創(chuàng)建對象都會被調(diào)用
9、?局部代碼塊:方法里的代碼塊
3.7.2?????靜態(tài)變量和實例變量的區(qū)別
在語法定義上的區(qū)別:靜態(tài)變量前要加static關(guān)鍵字,而實例變量前則不加。
在程序運行時的區(qū)別:實例變量屬于某個對象的屬性,必須創(chuàng)建了實例對象,其中的實例變量才會被分配空間,才能使用這個實例變量。靜態(tài)變量不屬于某個實例對象,而是屬于類,所以也稱為類變量,只要程序加載了類的字節(jié)碼,不用創(chuàng)建任何實例對象,靜態(tài)變量就會被分配空間,靜態(tài)變量就可以被使用了??傊?,實例變量必須創(chuàng)建對象后才可以通過這個對象來使用,靜態(tài)變量則可以直接使用類名來引用。
?
?
3.7.3?????向上轉(zhuǎn)型和向下轉(zhuǎn)型
在JAVA中,繼承是一個重要的特征,通過extends關(guān)鍵字,子類可以復用父類的功能,如果父類不能滿足當前子類的需求,則子類可以重寫父類中的方法來加以擴展。
在應用中就存在著兩種轉(zhuǎn)型方式,分別是:向上轉(zhuǎn)型和向下轉(zhuǎn)型。
比如:父類Parent,子類Child
向上轉(zhuǎn)型:父類的引用指向子類對象Parent p=new Child();
說明:向上轉(zhuǎn)型時,子類對象當成父類對象,只能調(diào)用父類的功能,如果子類重寫了父類的方法就根據(jù)這個引用指向調(diào)用子類重寫方法。
向下轉(zhuǎn)型(較少):子類的引用的指向子類對象,過程中必須要采取到強制轉(zhuǎn)型。
Parent??p = new Child();//向上轉(zhuǎn)型,此時,p是Parent類型
Child c = (Child)p;//此時,把Parent類型的p轉(zhuǎn)成小類型Child
//其實,相當于創(chuàng)建了一個子類對象一樣,可以用父類的,也可以用自己的
說明:向下轉(zhuǎn)型時,是為了方便使用子類的特殊方法,也就是說當子類方法做了功能拓展,就可以直接使用子類功能。
3.7.4?????設(shè)計多態(tài)的程序
假設(shè)現(xiàn)在有一個汽車類,我們可以根據(jù)汽車類創(chuàng)建很多汽車對象。
1、??創(chuàng)建汽車類。提供啟動、停止、運行功能
2、??創(chuàng)建子類,繼承汽車類。覆蓋/重寫 啟動和停止功能
3、??創(chuàng)建子類對象,進行子類的功能測試
4、??創(chuàng)建多態(tài)對象,進行功能測試
4.1??異常
4.1.1?????概述
用來封裝錯誤信息的對象。
組成結(jié)構(gòu):類型,提示,行號。
4.1.2?????異常的繼承結(jié)構(gòu)
Throwable -?頂級父類
-- Error:系統(tǒng)錯誤,無法修復
-- Exception:可修復的錯誤
--RunTimeException
--ClassCastException
--ClassNotFoundException
4.1.3?????異常處理
程序中遇到了異常,通常有兩種處理方式:捕獲或者向上拋出。
當調(diào)用了一個拋出異常的方法時,調(diào)用位置可以不做處理繼續(xù)向上拋出也可以捕獲異常。
1、捕獲方式:
try{
????需要捕獲的代碼
}catch(異常類型??異常名){
????處理方案
}
2、拋出方式:
在會發(fā)生異常的方法上添加代碼:throws?異常類型
例如:??public static void main(String[] args)??throws Exception{
4.1.4?????測試
接收鍵盤輸入的兩個數(shù)字并做除法運算
4.2??訪問控制符
用來控制一個類,或者類中的成員的訪問范圍。

4.3??抽象類
4.3.1?????概念
Java中可以定義沒有方法體的方法,該方法由其子類來具體的實現(xiàn)。該沒有方法體的方法我們稱之為抽象方法,含有抽象方法的類我們稱之為抽象類。
抽象類可以理解為是一個只有方法聲明沒有方法體的特殊類。
舉例:水果,東西。。
修飾符?abstract?返回值 方法名(參數(shù)列表);
?
class A{
???????public void eat(){//聲明一樣,可以提取
??????????????syso("eat...B")????}
}
class B{
???????public void eat(){//聲明一樣,可以提取
???????syso("eat。。。A")???}
}????????????
abstract class C{
??????????????public?abstract?void eat();
}
4.3.2?????特點
1、??通過java關(guān)鍵字abstract實現(xiàn)
2、??可以修飾方法或者類
3、??抽象類中可以沒有抽象方法(由子類去實現(xiàn))
4、??如果類中有抽象方法,那該類必須定義為一個抽象類
5、??子類繼承了抽象類以后,要么還是一個抽象類,要么就把所有抽象方法都重寫
6、??多用于多態(tài)中
7、??抽象類不可以被實例化
?
4.3.3?????入門案例
4.4??抽象類的用法
4.4.1?????構(gòu)造函數(shù)
抽象類也有構(gòu)造方法,但是不能本身實例化。
那抽象類的構(gòu)造函數(shù)有啥用?一般用于給子類實例化。
4.4.2?????抽象類的成員變量
既可以有變量,也可以有常量。
4.4.3?????抽象類的成員方法
抽象類里,既可以有普通方法,有可以有抽象方法。
4.5??分析老師示例
具體事物:張老師,? ?李老師
共性:備課,講課
5.1??????接口
5.1.1?概念
Java里面由于不允許多重繼承,所以如果要實現(xiàn)多個類的功能,則可以通過實現(xiàn)多個接口來實現(xiàn)。
Java接口和Java抽象類代表的就是抽象類型,就是我們需要提出的抽象層的具體表現(xiàn)。OOP面向?qū)ο蟮木幊?,如果要提高程序的復用率,增加程序的可維護性,可擴展性,就必須是面向接口的編程,面向抽象的編程,正確地使用接口、抽象類這些太有用的抽象類型做為java結(jié)構(gòu)層次上的頂層。
interface?接口名{??代碼…??}
5.1.2?????特點
1、?接口中都是抽象方法
2、?通過interface關(guān)鍵字創(chuàng)建接口
3、?通過implements讓子類來實現(xiàn)
4、?可以理解成,接口是一個特殊的抽象類
5、?接口突破了java的單繼承的局限性
6、?接口和類之間可以多實現(xiàn),接口和接口之間可以多繼承
7、?接口是對外暴露的規(guī)則,是一套開發(fā)規(guī)范
8、?接口提高了程序的功能擴展,降低了耦合性
?
5.1.3?????入門案例
5.2??接口的用法
5.2.1?????構(gòu)造方法
接口里是沒有構(gòu)造方法的。
在創(chuàng)建實現(xiàn)類的對象時默認的super(),是調(diào)用的默認Object的無參構(gòu)造。
interface?Fu{//定義一個接口
???????public?abstract?void?show();
???????//Interfaces cannot have constructors
???????/*public?Fu(){
??????????????System.out.println("Fu.Fu()");
???????}*/
}
5.2.2?????成員變量
接口里沒有成員變量,都是常量。所以,你定義一個變量沒有寫修飾符時,默認會加上:
public static final
5.2.3?????接口的成員方法
接口里的方法,默認就都是抽象的,如果你不寫明是abstract的,那會自動補齊。
例如:public?abstract?void save
5.3??????接口的復雜用法
Java中單繼承的局限性通過接口可以解決。
接口可以多繼承也可以多實現(xiàn),甚至可以繼承的同時多實現(xiàn)。
5.4??總結(jié)
1、類和類的關(guān)系:繼承?extends /?單繼承?/?單根繼承
????--?繼承的意義:為了提高代碼的復用性,減少了代碼的編寫提高開發(fā)效率。
????--?方法重寫的意義:在不修改父類源碼的前提下,在子類中重寫業(yè)務,從此使用的就是重寫后的功能。
???????--?要求子類的方法聲明和父類一樣,只要改方法體。
????--?有了繼承有了重寫就產(chǎn)生了多態(tài),多態(tài)的意義:為了統(tǒng)一程序的調(diào)用標準,標準就是父類。
????--?多態(tài)?也就是向上轉(zhuǎn)型/向上造型。
????--?向下造型的意義:很少用,相當于想要使用子類的特殊功能,還不如直接創(chuàng)建子類對象簡單。
????-- class A extends B
????--?其中,A和B都是類,A是子類,B是父類,A就擁有了B的所有功能(除了私有的和構(gòu)造方法)
?
????--?其他知識點:this?和super??,構(gòu)造方法,各種代碼塊...
?
2、類和接口關(guān)系:實現(xiàn)implements??/?單實現(xiàn)?/?多實現(xiàn)
????-- class A implements B,C
????--?其中,A是實現(xiàn)類,B和C是接口
????--?要求A?可以把?B?和C?接口里的所有?抽象方法?都重寫掉,否則?A?就是抽象類
????--?接口不能創(chuàng)建對象
????--?接口里沒有構(gòu)造方法,接口里都是常量,接口里都是抽象方法
?
3、接口和接口關(guān)系:繼承extends /?單繼承?/?多繼承
????--?接口的多繼承的關(guān)系,打破了java單繼承的局限性
????-- interface A??extends??B,C
????--?其中,A B C?都是接口,A是子接口,同時擁有B和C接口里的所有功能
????-- class AImpl implements??A
????--?要求AImpl需要重寫A接口里的所有方法(是包含B和C接口的所有方法),否則就是抽象類
?
4、接口和抽象類的區(qū)別?。。?/p>
????--?相同點:都是抽象層,都不能實例化??????????????????????
????--?不同點:
???????-- 1、抽象類用abstract關(guān)鍵字描述,接口用interface
???????-- 2、子類和抽象類之間是extends關(guān)系,實現(xiàn)類和接口之間是implements關(guān)系
???????-- 3、抽象類中?可以??有構(gòu)造方法?,接口里?不能?出現(xiàn)?構(gòu)造方法
???????-- 4、抽象類里可以有?變量,接口里沒有變量全都是靜態(tài)的常量
???????-- 5、接口里定義常量的語法:public static final String NAME="jack",會為變量自動拼接public static final
???????-- 6、抽象類里?可以有普通方法??也可以有?抽象方法,接口都是抽象方法
???????-- 7、抽象類和子類之間是繼承關(guān)系,而且java中,只支持單繼承
???????-- 8、接口突破了java單繼承的局限性,因為接口可以多繼承也可以多實現(xiàn),甚至可以繼承的同時多實現(xiàn)
???????-- 9、接口的復雜用法
???????????--?多繼承:?interface A??extends??B,C??其中A是子接口,同時擁有自己的和BC的功能
???????????--?多實現(xiàn):?class AImpl implements M,N,O,P?其中AImpl是實現(xiàn)類,需要同時重寫MNOP的所有抽象方法,否則就是一個抽象類
???????????--?繼承的同時多實現(xiàn):?class AImpl extends Object implements M,N?一定是先繼承后實現(xiàn)
5.5??設(shè)計模式
Java中有23?種設(shè)計模式,本質(zhì)是面向?qū)ο笤O(shè)計原則的實際運用,是對類的封裝性、繼承性和多態(tài)性,以及類的關(guān)聯(lián)關(guān)系和組合關(guān)系的充分理解。
當然,軟件設(shè)計模式只是一個引導,在實際的軟件開發(fā)中,必須根據(jù)具體的需求來選擇。
1、?對于簡單的程序,可能寫一個簡單的算法要比引入某種設(shè)計模式更加容易。
2、?但是對于大型項目開發(fā)或者框架設(shè)計,用設(shè)計模式來組織代碼顯然更好。
5.5.1?????單例設(shè)計模式概念
單例模式可以說是大多數(shù)開發(fā)人員在實際中使用最多的,常見的Spring默認創(chuàng)建的bean就是單例模式的。
單例模式有很多好處,比如可節(jié)約系統(tǒng)內(nèi)存空間,控制資源的使用。
其中單例模式最重要的是確保對象只有一個。
簡單來說,保證一個類在內(nèi)存中的對象就一個。
RunTime就是典型的單例設(shè)計,我們通過對RunTime類的分析,一窺究竟。
5.5.2?????源碼剖析
5.5.3?????餓漢式
目的:控制外界創(chuàng)建對象的個數(shù)只能創(chuàng)建1個對象
開發(fā)步驟:
1、?私有化構(gòu)造方法
2、?在類的內(nèi)部創(chuàng)建好對象
3、?對外界提供一個公共的get(),返回一個已經(jīng)準備好的對象
5.5.4?????懶漢式
5.6??拓展
5.6.1?????abstract注意事項
抽象方法要求子類繼承后必須重寫。那么,abstract關(guān)鍵字不可以和哪些關(guān)鍵字一起使用呢?以下關(guān)鍵字,在抽象類中。用是可以用的,只是沒有意義了。
1、?private:被私有化后,子類無法重寫,與abstract相違背。
2、?static:靜態(tài)的,優(yōu)先于對象存在。抽象方法需要子類重寫,而靜態(tài)的方法是無法被重寫的,因此二者是矛盾的。
3、?final:被final修飾后,無法重寫,與abstract相違背。
?
5.6.2?????接口和抽象類的區(qū)別
1、抽象類和接口都不能直接實例化,如果要實例化,抽象類變量必須指向?qū)崿F(xiàn)所有抽象方法的子類對象,接口變量必須指向?qū)崿F(xiàn)所有接口方法的類對象。
2、抽象類要被子類繼承,接口要被類實現(xiàn)。
3、接口只能做方法申明,抽象類中可以做方法申明,也可以做方法實現(xiàn)
4、接口里定義的變量只能是公共的靜態(tài)的常量,抽象類中的變量是普通變量。
5、抽象類里的抽象方法必須全部被子類所實現(xiàn),如果子類不能全部實現(xiàn)父類抽象方法,那么該子類只能是抽象類。同樣,一個實現(xiàn)接口的時候,如不能全部實現(xiàn)接口方法,那么該類也只能為抽象類。
6、抽象方法只能申明,不能實現(xiàn),接口是設(shè)計的結(jié)果 ,抽象類是重構(gòu)的結(jié)果
7、抽象類里可以沒有抽象方法,如果要擴展抽象類的新方法,子類將很容易的就能得到這些新方法。
8、如果一個類里有抽象方法,那么這個類只能是抽象類
9、抽象方法要被實現(xiàn),所以不能是靜態(tài)的,也不能是私有的。
10、接口可繼承接口,并可多繼承接口,但類只能單根繼承。
5.6.3? ? ?了解軟件設(shè)計的開閉原則OCP
開放功能擴展,關(guān)閉源碼修改。等
開閉原則的英文全稱是Open Close Principle,縮寫是OCP,它是Java世界里最基礎(chǔ)的設(shè)計原則,它指導我們?nèi)绾谓⒁粋€穩(wěn)定的、靈活的系統(tǒng)。
開閉原則的定義是:軟件中的對象(類、模塊、函數(shù)等)應該對于擴展是開放的,但是對于修改是封閉的。
開閉原則,是一種設(shè)計模式,隨著面向?qū)ο蟪绦蛟O(shè)計的思想,應運而生。
開,指的是可以在源代碼的基礎(chǔ)上進行擴展,比如繼承,接口,抽象類等。在JAVA中,之所以用繼承,是在可以直接調(diào)用類庫的前提下,對其功能進行擴展。不需要應用者去了解封裝類的內(nèi)部邏輯就可以做開發(fā)。
閉:指不允許對原有的代碼進行修改。以免影響其他現(xiàn)有功能,造成功能癱瘓。