一、編程思想
????1、面向過程
????????面向過程:關(guān)注的是過程——步驟。
????????站在一個執(zhí)行者的角度考慮問題,做事情。
????2、面向?qū)ο?/p>
????????面相對向:關(guān)注的是對象——。
????????站在一個指揮者的角度。
????????是一種編程思想,不是一種編程語言。
????????如何使用面向?qū)ο蟮乃季S方式思考問題?
????????????A:思考問題域中涉及到了哪些對象。
????????????B:設(shè)計這些對象。(構(gòu)建類)
????????????C:對象和對象之間的關(guān)系。
????繼承關(guān)系:is - a
????實現(xiàn)關(guān)系:實現(xiàn)類,實現(xiàn)接口。
????依賴關(guān)系:一個類作為另一個類的方法的參數(shù)。
????關(guān)聯(lián)關(guān)系:一個類作為另一個類的屬性。
二、類和對象【重點】
????2.1 類
????????概念:類,就是類別。同一類事物的抽象描述。
????????- 類的屬性:成員變量,描述類的外部的特征的。選"名詞"。
????????- 類的功能:成員方法,描述類的行為功能的。選"動詞"。
????????示例代碼:
????????????publicclassPerson{
? ????????????? Stringname;
? ????????????????? intage;
????????????? ? publicvoideat(){
? ????????? }
????}
2.2 對象
????概念:類中的一個具體的實例。
????????- 對象就是可以訪問類中的數(shù)據(jù):賦值,取值
????????- 對象還可以執(zhí)行類中的方法:將方法進(jìn)行調(diào)用。
2.3 實例化一個對象
????????就是通過調(diào)用類的構(gòu)造方法,進(jìn)行創(chuàng)建對象,就得到了該類的實例。
????????????Personp1=newPerson();
????????????類和對象的關(guān)系:
????????將類進(jìn)行實例化,就得到了對象。
????????如果將所有的對象的共同特征,進(jìn)行抽取,然后加以描述。就是構(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關(guān)鍵字來調(diào)用,開辟內(nèi)存,創(chuàng)建對象。
????注意點:
????????如果一個類中,沒有顯示的構(gòu)造方法,那么由編譯器自動添加一個,無參構(gòu)造方法。
????????如果類中,有了自己寫的構(gòu)造方法,那么編譯器不會再給添加任何的構(gòu)造方法。
示例代碼:
????????publicclassPerson{
? ????????? Stringname;
????????? ? intage;
????????????publicvoidPerson(){}
????????????publicvoidPerson(Stringname,intage){}
? ?????????????publicvoideat(){
?????????????}
????????????}
編碼習(xí)慣:
私有化屬性
提供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 概念
????????????概念:"打包"的概念。保護(hù)數(shù)據(jù)安全。隱藏類的實現(xiàn)細(xì)節(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、默認(rèn)的:啥都不寫就是默認(rèn)的(缺省),限于同包下能夠訪問
????????3、protected:受保護(hù)的,限于同包下能夠訪問,不同包需要子類中才能夠使用。
????????4、public:公共的, 沒有限制。
????示例代碼:
????????publicclassPerson{
? ????????? privateStringname;
? ????????? privateintage;
????????publicvoidsetName(Stringname){//就近原則
????????????this.name=name;
?????????? }
? ????? publicvoideat(){
? ? ? ????? System.out.println(name+",吃東西啦。。");
????? ? }
????}
????3.1.3 this關(guān)鍵字
????????詞義:這個,
????????用法一:指代本類的對象。
????????????可以訪問本類的屬性和方法。在本類中使用的時候,this可以省略。編譯器會自動添加。
????????????但是,當(dāng)局部變量名和成員變量,命名沖突時,可以使用this來進(jìn)行區(qū)分。
????????用法二:指代本類的構(gòu)造方法。
????????????this(),就表示構(gòu)造方法。當(dāng)前類的。
????????????如果類中有多個構(gòu)造方法,那么靠參數(shù)來區(qū)分:this()-->無參構(gòu)造,this(參數(shù))-->有參構(gòu)造要位于首行。
????3.2 繼承性
????????3.2.1 概念
????????概念:描述兩個類的關(guān)系。一個類(子類)繼承了另一個類(父類)。
? ????????? 滿足 子類 is - a 父類 范式,兩個類才可以使用繼承。
? ? ????????????父類:基類,超類,SuperClass
? ? ????????????子類:派生類,SubClass
????????- 子類中可以直接訪問父類的非私有化的屬性和方法。
????????- 子類可以新增自己的屬性和方法。
????????- 子類還可以重寫父類的方法。
????3.2.2 作用
????????1、降低程序的冗余,避免重復(fù)的代碼。
????????2、子類擴(kuò)展父類的功能。
????????3、模擬現(xiàn)實世界的關(guān)系。
????3.2.3 關(guān)鍵字
????????extends:詞義,擴(kuò)展
????????classSuperClass{}?
????classSubClassextendsSuperClass{}
????3.2.4 繼承的局限
????????Java中只支持單繼承:一個類只能有一個父類。
????????但是允許多層繼承:爺爺-爸爸-孫子
????3.2.5 子類對象的創(chuàng)建過程
????????先執(zhí)行父類的構(gòu)造方法:開辟父類中屬性
????????再執(zhí)行子類的構(gòu)造方法:
? ? ? ? ? 意味著:子類的構(gòu)造方法,第一行一定是調(diào)用了父類的構(gòu)造方法。默認(rèn)調(diào)用父類的無參構(gòu)造方法。如果子類的構(gòu)造方法,沒有顯示的調(diào)用父類的構(gòu)造方法, 那么由編譯器自動添加super(),表示調(diào)用父類的無參構(gòu)造。3.2.6?
????super關(guān)鍵字
????????可以直接訪問父類的屬性和方法。
????????指代父類的構(gòu)造方法。有參,無參。位于首行。
????????注意和this關(guān)鍵字的對比。
????3.2.7 方法重寫:override
????????概念:繼承中,子類將父類已有的方法,重新實現(xiàn)。(重新提供一個方法體)?
????規(guī)則:
? ????? 1、繼承結(jié)構(gòu)中
????? ? 2、重寫方法聲明必須和父類的一致:返回值類型,方法名,參數(shù)列表。
????? ? 3、訪問權(quán)限,不能比父類更加嚴(yán)格:private-默認(rèn)的-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關(guān)鍵字:
????來判斷某個引用指向的對象,是否屬于某個類(包含父類)。
????向下轉(zhuǎn)型前:先使用instanceof關(guān)鍵字,判斷是否是該類型,否則會失敗: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)性的應(yīng)用
????????將父類的類型作為參數(shù),可以傳入任意的子類對象。傳參:向上轉(zhuǎn)型。
????????將父類的類型作為返回值,可以返回任意的子類對象。
????????publicstaticvoidtest(Animala){
????}
?????????publicAnimalgetAnimal(){
????????//......
????????returnnewCat();
????}
????publicstaticvoidmain(String[]args){
????Animala1=newAnimal();
? ? ? ? test(a1);
test(c1);
}
?
四、static,final、abstract關(guān)鍵字
????4.1 static關(guān)鍵字
????????????含義:"靜態(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ù)。
????????應(yīng)用:類的所有的對象的某個屬性值都相同,就可以設(shè)計為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關(guān)鍵字。
????????應(yīng)用:如果一個方法中不涉及對象的內(nèi)容,就可以設(shè)計為靜態(tài)方法。由類直接調(diào)用,不需要創(chuàng)建對象。比較簡潔。
????????工具類:往往都是靜態(tài)方法,由類直接調(diào)用。
????4.1.3 代碼塊{}
????????局部代碼塊:
????????也叫普通代碼塊。就是方法中的一塊代碼。if,for,while。。。{}
????????注意作用域
????????????構(gòu)造代碼塊:
????????????????????類里,方法外的代碼塊。
????????????????????當(dāng)創(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修飾的代碼塊
????????????????????當(dāng)程序加載的時候執(zhí)行,優(yōu)先于main執(zhí)行,只執(zhí)行1次
????????????????????如果有些代碼在項目啟動的時候就執(zhí)行,可以寫在static代碼塊中。
????????????同步代碼塊:
????????????????????多線程
????4.2 final關(guān)鍵字
????????????詞義:"最終的,最后的"
? ? ? ? ? ? ?修飾變量——>不允許在修改值。常量:所有的字母都大寫。
????????????局部變量
????????????成員變量
? ? ? ? ? ? 修飾方法——>不允許子類重寫
? ? ? ? ? ? 修飾類——>不允許子類繼承
????4.3 abstract關(guān)鍵字
????????含義:"抽象的"
????????修飾方法:抽象方法
????????該方法只有方法的聲明(功能描述),沒有方法體,{}也沒有,直接;結(jié)束了。
????????目的:將功能的聲明和實現(xiàn)分離開。強制子類必須重寫
????????????所在的類,必須是抽象的。
????????????修飾類:抽象類——>"做爸爸"
????????????不能被實例化,也就是說不能創(chuàng)建對象
????????????抽象類中可能包含有抽象方法。
????????????必須等待子類來繼承,并且實現(xiàn)所有的抽象方法。才允許創(chuàng)建子類對象
????????????如果子類沒有實現(xiàn)全部的抽象方法,那么子類也是抽象的,要再等子類繼承并實現(xiàn)抽象方法。
????????????抽象類:作為父類。用于繼承。
????????????抽象類:成員變量,常量,靜態(tài)成員變量,成員方法,靜態(tài)方法,構(gòu)造方法,final方法,抽象方法。。。
????????????抽象方法所在的類,必須抽。
????????????抽象類中不一定非要包含抽象方法。
五、接口
????5.1 概念
????????接口就是一個協(xié)議,一種規(guī)則,一個標(biāo)準(zhǔn),一個功能聲明。
????????????USB,Type-C。。。。
????5.2 接口的語法
????????//聲明一個接口
????????interfaceA{
? ????????????? //靜態(tài)常量
????????????????//抽象方法
????????}
?
????????//接口更不允許實例化,需要有實現(xiàn)類來實現(xiàn)接口中的方法。
????????classA1implementsA{
????????//此處實現(xiàn)接口A中的所有抽象方法。
????}
????????接口中:
????????????靜態(tài)常量:默認(rèn)的修飾符,public static final
????????????抽象方法:默認(rèn)的修飾符: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)。
二、匿名內(nèi)部類
????匿名內(nèi)部類:沒有名字的內(nèi)部的類。
????前提:接口或繼承父類。
????直接new匿名內(nèi)部類的對象
????????interfaceA{
? ????????? publicvoidtest();
????????}
?
????????//A a = new 實現(xiàn)類對象;
????????Aa=newA(){//從此處開始,就是匿名的呢不累
????????????????publicvoidtest();
????????????};//到此處結(jié)束
????????a.test();
一般匿名內(nèi)部類適合:使用一次,創(chuàng)建一次對象。
匿名內(nèi)部類:編譯之后產(chǎn)生字節(jié)碼文件:
內(nèi)部類的字節(jié)碼文件名的規(guī)則:先寫外部類名,然后$,然后是內(nèi)部類的名
外部類$1.class
外部類$2.class
....
2.3、Object類
????Java中所有的類,都是以繼承結(jié)構(gòu)存在的。
????Object類是所有類的基類。所以只要是Java中的類的對象,默認(rèn)都可以執(zhí)行Object類中的方法。
????java.lang這個包下的類,在使用的時候,無需導(dǎo)入。其他的包下的類,需要導(dǎo)包。
????importjava.util.Scanner;
????importjava.util.Arrays;?
????java.lang.Object
????java.lang.String
????1、getClass()-->Class
????獲取一個引用指向的對象,是哪個類型的。返回值類型,目前超綱。
????想判斷兩個對象是否是同一個類型:obj1.getClass()==obj2.getClass()