一涯雅、編程思想
1鲜结、面向過程
面向過程:關注的是過程——步驟。
站在一個執(zhí)行者的角度考慮問題活逆,做事情轻腺。
2、面向?qū)ο?/p>
面相對向:關注的是對象——划乖。
站在一個指揮者的角度贬养。
是一種編程思想,不是一種編程語言琴庵。
如何使用面向?qū)ο蟮乃季S方式思考問題误算?
A:思考問題域中涉及到了哪些對象。
B:設計這些對象迷殿。(構(gòu)建類)
C:對象和對象之間的關系儿礼。
繼承關系:is - a
實現(xiàn)關系:實現(xiàn)類,實現(xiàn)接口庆寺。
依賴關系:一個類作為另一個類的方法的參數(shù)蚊夫。
關聯(lián)關系:一個類作為另一個類的屬性。
二懦尝、類和對象【重點】
2.1 類
概念:類知纷,就是類別壤圃。同一類事物的抽象描述。
- 類的屬性:成員變量琅轧,描述類的外部的特征的伍绳。選"名詞"。
- 類的功能:成員方法乍桂,描述類的行為功能的冲杀。選"動詞"。
示例代碼:
publicclassPerson{
? ? Stringname;
? ? intage;
? ? publicvoideat(){
? ? }
}
2.2 對象
概念:類中的一個具體的實例睹酌。
- 對象就是可以訪問類中的數(shù)據(jù):賦值权谁,取值
- 對象還可以執(zhí)行類中的方法:將方法進行調(diào)用。
2.3 實例化一個對象
就是通過調(diào)用類的構(gòu)造方法憋沿,進行創(chuàng)建對象旺芽,就得到了該類的實例。
Personp1=newPerson();
類和對象的關系:
將類進行實例化卤妒,就得到了對象甥绿。
如果將所有的對象的共同特征,進行抽取则披,然后加以描述共缕。就是構(gòu)建這個類。
2.4 構(gòu)造方法
構(gòu)造方法士复,又叫構(gòu)造器图谷,構(gòu)造函數(shù)。Constructor阱洪。
就是一個特殊的方法便贵。
1、作用:專門用于創(chuàng)建對象的冗荸。
2承璃、聲明:要區(qū)別于普通的方法。
? ? 修飾符:只允許訪問權(quán)限修飾符蚌本。
? ? 返回值:沒有盔粹,不能寫void。
? ? 方法名:必須和類名一致程癌。
? ? 參數(shù)列表:無參舷嗡,有參
3、調(diào)用:必須通過new關鍵字來調(diào)用嵌莉,開辟內(nèi)存进萄,創(chuàng)建對象。
注意點:
如果一個類中,沒有顯示的構(gòu)造方法中鼠,那么由編譯器自動添加一個可婶,無參構(gòu)造方法。
如果類中兜蠕,有了自己寫的構(gòu)造方法扰肌,那么編譯器不會再給添加任何的構(gòu)造方法抛寝。
示例代碼:
publicclassPerson{
? ? Stringname;
? ? intage;
publicvoidPerson(){}
publicvoidPerson(Stringname,intage){}
? ? publicvoideat(){
? ? }
}
編碼習慣:
私有化屬性
提供getter和setter方法
添加無參構(gòu)造熊杨,和有參構(gòu)造。
2.5 匿名對象
只有對象的創(chuàng)建盗舰,沒有對象的聲明晶府。就是沒有名字的對象:就是沒有一個引用持有它的地址。
//正常的對象:=左邊做對象的聲明钻趋,就是個引用川陆, =右邊在創(chuàng)建對象,創(chuàng)建完對象之后蛮位,會將對象的內(nèi)存地址給p1较沪。p1叫做引用,叫做對象失仁。
Personp1=newPerson();//引用類型
?
//匿名對象:
newPerson().eat();
"一次性的"尸曼。隨著對象的創(chuàng)建而使用一次。
三萄焦、面向?qū)ο蟮娜筇卣?/p>
3.1 封裝性
3.1.1 概念
概念:"打包"的概念控轿。保護數(shù)據(jù)安全。隱藏類的實現(xiàn)細節(jié)拂封,對外提供統(tǒng)一的操作茬射。
體現(xiàn):
? ? 1、類的封裝冒签。
? ? 2在抛、方法的封裝。
? ? 3萧恕、屬性的封裝
? ? ? ? step1:使用private修飾屬性刚梭,限于本類中使用
? ? ? ? step2:提供getter和setter方法,用于給屬性賦值和取值廊鸥。
? ? ? ? ? ? ? ? 注意點:boolean類型望浩,isXXX();
3.1.2 訪問權(quán)限修飾符
1、private:限于類的內(nèi)部能夠訪問
2惰说、默認的:啥都不寫就是默認的(缺省),限于同包下能夠訪問
3磨德、protected:受保護的,限于同包下能夠訪問,不同包需要子類中才能夠使用典挑。
4酥宴、public:公共的, 沒有限制您觉。
示例代碼:
publicclassPerson{
? ? privateStringname;
? ? privateintage;
publicvoidsetName(Stringname){//就近原則
this.name=name;
?? }
? ? publicvoideat(){
? ? ? ? System.out.println(name+"拙寡,吃東西啦。琳水。");
? ? }
}
3.1.3 this關鍵字
詞義:這個肆糕,
用法一:指代本類的對象。
可以訪問本類的屬性和方法在孝。在本類中使用的時候诚啃,this可以省略。編譯器會自動添加私沮。
但是始赎,當局部變量名和成員變量,命名沖突時仔燕,可以使用this來進行區(qū)分造垛。
用法二:指代本類的構(gòu)造方法。
this()晰搀,就表示構(gòu)造方法五辽。當前類的。
如果類中有多個構(gòu)造方法厕隧,那么靠參數(shù)來區(qū)分:this()-->無參構(gòu)造奔脐,this(參數(shù))-->有參構(gòu)造
要位于首行。
3.2 繼承性
3.2.1 概念
概念:描述兩個類的關系吁讨。一個類(子類)繼承了另一個類(父類)髓迎。
? ? 滿足 子類 is - a 父類 范式,兩個類才可以使用繼承建丧。
? ? 父類:基類排龄,超類,SuperClass
? ? 子類:派生類翎朱,SubClass
?
- 子類中可以直接訪問父類的非私有化的屬性和方法橄维。
- 子類可以新增自己的屬性和方法。
- 子類還可以重寫父類的方法拴曲。
3.2.2 作用
1争舞、降低程序的冗余,避免重復的代碼澈灼。
2竞川、子類擴展父類的功能店溢。
3、模擬現(xiàn)實世界的關系委乌。
3.2.3 關鍵字
extends:詞義床牧,擴展
classSuperClass{}
?
classSubClassextendsSuperClass{}
3.2.4 繼承的局限
Java中只支持單繼承:一個類只能有一個父類。
但是允許多層繼承:爺爺-爸爸-孫子
3.2.5 子類對象的創(chuàng)建過程
先執(zhí)行父類的構(gòu)造方法:開辟父類中屬性
再執(zhí)行子類的構(gòu)造方法:
意味著:子類的構(gòu)造方法遭贸,第一行一定是調(diào)用了父類的構(gòu)造方法戈咳。默認調(diào)用父類的無參構(gòu)造方法。如果子類的構(gòu)造方法壕吹,沒有顯示的調(diào)用父類的構(gòu)造方法著蛙, 那么由編譯器自動添加super(),表示調(diào)用父類的無參構(gòu)造算利。
3.2.6 super關鍵字
可以直接訪問父類的屬性和方法册踩。
指代父類的構(gòu)造方法泳姐。有參效拭,無參。位于首行胖秒。
注意和this關鍵字的對比缎患。
3.2.7 方法重寫:override
概念:繼承中,子類將父類已有的方法阎肝,重新實現(xiàn)挤渔。(重新提供一個方法體)
?
規(guī)則:
? ? 1、繼承結(jié)構(gòu)中
? ? 2风题、重寫方法聲明必須和父類的一致:返回值類型判导,方法名,參數(shù)列表沛硅。
? ? 3眼刃、訪問權(quán)限,不能比父類更加嚴格:private-默認的-protected-public
? ? 4摇肌、重寫方法不能拋出比父類更大的異常擂红。
3.3 多態(tài)性
3.3.1 概念
概念:事物的多種形態(tài)。
3.3.2 方法的多態(tài)
方法的多態(tài):一個方法的多種形態(tài)--->方法的重載(overload)围小。
概念:同一個功能方法昵骤,根據(jù)參數(shù)不同,執(zhí)行的具體的方法也不同肯适。
classA{
? ? publicvoidadd(inti,intj){//1
? ? }
publicvoidadd(doubled1,doubled2){//2
?? }
}
規(guī)則:
1变秦、同一個類中
2、方法名必須一致框舔。
3蹦玫、參數(shù)列表必須不同:順序,類型,個數(shù)钳垮。
對象的多態(tài):結(jié)合方法的重寫惑淳。
3.3.3 對象的多態(tài)&方法的重寫
子類對象的向上轉(zhuǎn)型和向下轉(zhuǎn)型。
父類:Animal饺窿,子類:Cat歧焦,Dog
classAniaml{
? ? Stringname;
? ? intage;
? ? publicvoideat(){}
? ? publicvoidsleep(){}
}
classCat{
? ? Stringcolor;
? ? @override
? ? publicvoideat(){
? ? }
//新增
publicvoidcatchMouse(){
?? }
}
1、向上轉(zhuǎn)型:子類對象向上轉(zhuǎn)型后肚医,會失去子類新增绢馍。可以訪問的是父類的屬性和方法肠套,以及子類重寫舰涌。
2、向下轉(zhuǎn)型:以向上轉(zhuǎn)型為前提你稚,將子類對象瓷耙,由父類類型,再轉(zhuǎn)為子類類型刁赖「橥矗可以重新獲訪問子類新增。
繼承結(jié)構(gòu)中宇弛,子類是一個特殊的父類類型鸡典。
?
父類類型,指向一個父類對象枪芒。
Animala1=newAniaml();
也可以指向一個子類對象彻况。子類對象的向上轉(zhuǎn)型。
Animala2=newCat();//向上轉(zhuǎn)型舅踪,name纽甘,age,重寫eat()硫朦,sleep()
Catc1=newCat();
?
Catc2=(Cat)a2;//向下轉(zhuǎn)型,name,age,color,重寫eat()贷腕,sleep(),catchMouse()
instanceof關鍵字:
來判斷某個引用指向的對象咬展,是否屬于某個類(包含父類)泽裳。
向下轉(zhuǎn)型前:先使用instanceof關鍵字,判斷是否是該類型破婆,否則會失斾套堋:ClassCastException
語法:
引用instanceof類名
--->boolean的結(jié)果:true,false
Animala1=newAnimal();
Catc1=newCat();
a1instanceofAnimal--->true
c1instanceofCat--->true
c1instanceofAnimal--->true
a1instanceofCat--->false
3祷舀、結(jié)合方法的重寫
總結(jié):
如果想知道一個引用瀑梗,能夠訪問哪些烹笔?看=左邊是什么類型的。
如果=左邊聲明的是父類類型抛丽,那么就調(diào)用父類中聲明谤职。
如果=左邊聲明的是子類子類,那么就調(diào)用父類中的亿鲜,以及子類新增的允蜈。
如果想知道一個引用,執(zhí)行的方法是否重載蒿柳?看=右邊真正創(chuàng)建的是哪個對象
如果=右邊創(chuàng)建的是父類對象饶套,那么調(diào)用父類中。
如果=右邊創(chuàng)建的是子類對象垒探,那么調(diào)用子類重寫的方法妓蛮。
對象多態(tài)性結(jié)合方法的重寫:如何體現(xiàn)多態(tài)的?
Animal a1 = new Aniaml();//調(diào)用父類的方法圾叼,不是子重寫的蛤克。
Animal a2 = new Cat();//調(diào)用父類中聲明的,但是是子類重寫的方法褐奥。
?
a1,a2---->Animal
? ? 根據(jù)new的對象不同咖耘,可能調(diào)用重寫的(子類對象),也可能調(diào)用不重寫(父類對象)撬码。
4、對象多態(tài)性的應用
將父類的類型作為參數(shù)版保,可以傳入任意的子類對象呜笑。傳參:向上轉(zhuǎn)型。
將父類的類型作為返回值彻犁,可以返回任意的子類對象叫胁。
publicstaticvoidtest(Animala){
?
}
?
publicAnimalgetAnimal(){
//......
returnnewCat();
}
publicstaticvoidmain(String[]args){
Animala1=newAnimal();
Catc1=newCat();
? ? test(a1);
test(c1);
}
?
?
四、static汞幢,final驼鹅、abstract關鍵字
4.1 static關鍵字
含義:"靜態(tài)的",屬于類森篷。由類直接訪問输钩。
4.1.1 靜態(tài)屬性
由static修飾的成員變量,就表示為靜態(tài)成員仲智。也叫做靜態(tài)屬性买乃。屬于類,只有一份钓辆。在內(nèi)存中另一塊空間剪验。多個對象也可以訪問肴焊,共享這一份數(shù)據(jù)。
靜態(tài)屬性功戚,隨著類的加載而產(chǎn)生娶眷。成員變量,隨著對象的創(chuàng)建而產(chǎn)生啸臀。幾個對象茂浮,就幾份獨立的成員變量的數(shù)據(jù)。
應用:類的所有的對象的某個屬性值都相同壳咕,就可以設計為static的席揽。節(jié)省內(nèi)存,操作便捷谓厘。
4.1.2 靜態(tài)方法
由static修飾的方法幌羞,就叫做靜態(tài)方法。由類直接調(diào)用竟稳。對象也可以調(diào)用属桦,但是不建議。
靜態(tài)方法:可以有靜態(tài)的屬性以及調(diào)用其他的靜態(tài)方法他爸。
靜態(tài)方法:不能直接訪問非靜態(tài)的屬性和方法聂宾,以及不能出現(xiàn)this和super關鍵字。
應用:如果一個方法中不涉及對象的內(nèi)容诊笤,就可以設計為靜態(tài)方法系谐。由類直接調(diào)用,不需要創(chuàng)建對象讨跟。比較簡潔纪他。
工具類:往往都是靜態(tài)方法,由類直接調(diào)用晾匠。
4.1.3 代碼塊{}
局部代碼塊:
也叫普通代碼塊茶袒。就是方法中的一塊代碼。if凉馆,for薪寓,while。澜共。向叉。{}
注意作用域
構(gòu)造代碼塊:
類里,方法外的代碼塊咳胃。
當創(chuàng)建對象植康,隨著構(gòu)造方法的執(zhí)行而執(zhí)行。優(yōu)先于構(gòu)造方法執(zhí)行展懈。創(chuàng)建幾個對象销睁,就執(zhí)行幾次構(gòu)造代碼塊以及構(gòu)造方法供璧。
可以統(tǒng)一初始化非靜態(tài)的屬性
靜態(tài)代碼塊:
使用static修飾的代碼塊
當程序加載的時候執(zhí)行,優(yōu)先于main執(zhí)行冻记,只執(zhí)行1次
如果有些代碼在項目啟動的時候就執(zhí)行睡毒,可以寫在static代碼塊中。
同步代碼塊:
多線程
4.2 final關鍵字
詞義:"最終的冗栗,最后的"
修飾變量——>不允許在修改值演顾。常量:所有的字母都大寫。
局部變量
成員變量
修飾方法——>不允許子類重寫
修飾類——>不允許子類繼承
4.3 abstract關鍵字
含義:"抽象的"
修飾方法:抽象方法
該方法只有方法的聲明(功能描述)隅居,沒有方法體钠至,{}也沒有,直接胎源;結(jié)束了棉钧。
目的:將功能的聲明和實現(xiàn)分離開。強制子類必須重寫
所在的類涕蚤,必須是抽象的宪卿。
修飾類:抽象類——>"做爸爸"
不能被實例化,也就是說不能創(chuàng)建對象
抽象類中可能包含有抽象方法万栅。
必須等待子類來繼承佑钾,并且實現(xiàn)所有的抽象方法。才允許創(chuàng)建子類對象
如果子類沒有實現(xiàn)全部的抽象方法烦粒,那么子類也是抽象的休溶,要再等子類繼承并實現(xiàn)抽象方法。
抽象類:作為父類撒遣。用于繼承邮偎。
抽象類:成員變量,常量义黎,靜態(tài)成員變量,成員方法豁跑,靜態(tài)方法廉涕,構(gòu)造方法,final方法艇拍,抽象方法狐蜕。。卸夕。
抽象方法所在的類层释,必須抽。
抽象類中不一定非要包含抽象方法快集。
五贡羔、接口
5.1 概念
接口就是一個協(xié)議廉白,一種規(guī)則,一個標準乖寒,一個功能聲明猴蹂。
USB,Type-C楣嘁。磅轻。。逐虚。
5.2 接口的語法
//聲明一個接口
interfaceA{
? ? //靜態(tài)常量
//抽象方法
}
?
//接口更不允許實例化聋溜,需要有實現(xiàn)類來實現(xiàn)接口中的方法。
classA1implementsA{
//此處實現(xiàn)接口A中的所有抽象方法叭爱。
}
接口中:
靜態(tài)常量:默認的修飾符撮躁,public static final
抽象方法:默認的修飾符:public abstract
5.3 接口的使用
多實現(xiàn):一個實現(xiàn)類,可以同時實現(xiàn)多個接口涤伐,就意味著同時滿足多個規(guī)則馒胆。
多繼承:一個接口可以繼承另一個接口,而且可以同時繼承多個接口凝果。
類只允許單繼承祝迂,但是接口可以多繼承。因為接口中的方法器净,都是抽象的型雳,沒有具體的實現(xiàn)。
一個類,如果沒有實現(xiàn)接口中的所有的方法恳邀, 那么該類是抽象的妻熊。
一個類,可以繼承父類的同時冤荆,實現(xiàn)其他的接口。
特殊方法:
static方法权纤,允許有方法體钓简,由接口名直接調(diào)用。
JDK1.8版汹想,新增的功能:default方法:允許方法有方法體外邓。提供基本的功能,不強制實現(xiàn)類必須實現(xiàn)古掏。
5.4 接口的作用
降低了程序耦合性:功能的聲明和功能的實現(xiàn)分離開损话。面向接口編程。
定義的都是規(guī)則槽唾,都是抽象方法丧枪。保持了接口的一致光涂。
接口可以多繼承,使用起來更靈活豪诲,彌補了java單繼承的局限性顶捷。
5.5. 接口回調(diào)
一個接口A,和它的實現(xiàn)類屎篱,在另一個類B中服赎,持有了接口A的引用,調(diào)用接口中的方法交播,就是接口回調(diào)重虑。