第二十天學(xué)Java(面向?qū)ο罂偨Y(jié)以及匿名內(nèi)部類)

一、編程思想 

????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()

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容