(五)Java基礎文本資料整理多態(面向對象特徵之一)


(五)Java基礎文本資料整理多態(面向對象特徵之一)

多 態★★★★★(面向對象特徵之一):函數本身就具備多態性,某一種事物有不同的具體的體現。

體現:父類引用或者接口的引用指向了自己的子類對象。//Animal a = new Cat();父類可以調用子類中覆寫過的(父類中有的方法)

多態的好處:提高了程序的擴展性。繼承的父類或接口一般是類庫中的東西,(如果要修改某個方法的具體實現方式)只有通過子類去覆寫要改變的某一個方法,這樣在通過將父類的應用指向子類的實例去調用覆寫過的方法就行了!

多態的弊端:當父類引用指向子類對象時,雖然提高了擴展性,但是隻能訪問父類中具備的方法,不可以訪問子類中特有的方法。(前期不能使用後期產生的功能,即訪問的侷限性)

多態的前提:

1:必須要有關係,比如繼承、或者實現。

2:通常會有覆蓋操作。

如果想用子類對象的特有方法,如何判斷對象是哪個具體的子類類型呢?

可以可以通過一個關鍵字 instanceof ;//判斷對象是否實現了指定的接口或繼承了指定的類

格式:<對象 instanceof 類型> ,判斷一個對象是否所屬於指定的類型。

Student instanceof Person = true;//student繼承了person類

-------------------------------------------------------------------------------------java.lang.Object

Object:所有類的直接或者間接父類,Java認為所有的對象都具備一些基本的共性內容,這些內容可以不斷的向上抽取,最終就抽取到了一個最頂層的類中的,該類中定義的就是所有對象都具備的功能。

具體方法:

boolean equals(Object obj):用於比較兩個對象是否相等,其實內部比較的就是兩個對象地址。

2,String toString():將對象變成字符串;默認返回的格式:類名@哈希值 = getClass().getName() + '@' + Integer.toHexString(hashCode())

為了對象對應的字符串內容有意義,可以通過複寫,建立該類對象自己特有的字符串表現形式。

public String toString(){

return "person : "+age;

}

3,Class getClass():獲取任意對象運行時的所屬字節碼文件對象。

4,int hashCode():返回該對象的哈希碼值。支持此方法是為了提高哈希表的性能。將該對象的內部地址轉換成一個整數來實現的。

通常equals,toString,hashCode,在應用中都會被複寫,建立具體對象的特有的內容。

-------------------------------------------------------------------------------------

內部類:如果A類需要直接訪問B類中的成員,而B類又需要建立A類的對象。這時,為了方便設計和訪問,直接將A類定義在B類中。就可以了。A類就稱為內部類。內部類可以直接訪問外部類中的成員。而外部類想要訪問內部類,必須要建立內部類的對象。

-----------------------------------------------------

class Outer{

int num = 4;

class Inner {

void show(){

System.out.println("inner show run "+num);

}

}

public void method(){

Inner in = new Inner();//創建內部類的對象。

in.show();//調用內部類的方法。//內部類直接訪問外部類成員,用自己的實例對象;

} //外部類訪問內部類要定義內部類的對象;

}

-------------------------------------------------------

當內部類定義在外部類中的成員位置上,可以使用一些成員修飾符修飾 private、static。

1:默認修飾符。

直接訪問內部類格式:外部類名.內部類名 變量名 = 外部類對象.內部類對象;

Outer.Inner in = new Outer.new Inner();//這種形式很少用。

但是這種應用不多見,因為內部類之所以定義在內部就是為了封裝。想要獲取內部類對象通常都通過外部類的方法來獲取。這樣可以對內部類對象進行控制。

2:私有修飾符。

通常內部類被封裝,都會被私有化,因為封裝性不讓其他程序直接訪問。

3:靜態修飾符。

如果內部類被靜態修飾,相當於外部類,會出現訪問侷限性,只能訪問外部類中的靜態成員。

注意;如果內部類中定義了靜態成員,那麼該內部類必須是靜態的。

內部類編譯後的文件名為:"外部類名$內部類名.java";

為什麼內部類可以直接訪問外部類中的成員呢?

那是因為內部中都持有一個外部類的引用。這個是引用是 外部類名.this

內部類可以定義在外部類中的成員位置上,也可以定義在外部類中的局部位置上。

當內部類被定義在局部位置上,只能訪問局部中被final修飾的局部變量。

匿名內部類(對象):沒有名字的內部類。就是內部類的簡化形式。一般只用一次就可以用這種形式。匿名內部類其實就是一個匿名子類對象想要定義匿名內部類:需要前提,內部類必須繼承一個類或者實現接口。

匿名內部類的格式:new 父類名&接口名(){ 定義子類成員或者覆蓋父類方法 }.方法。

匿名內部類的使用場景:

當函數的參數是接口類型引用時,如果接口中的方法不超過3個。可以通過匿名內部類來完成參數的傳遞。

其實就是在創建匿名內部類時,該類中的封裝的方法不要過多,最好兩個或者兩個以內。

--------------------------------------------------------

//面試

//1

new Object(){

void show(){

System.out.println("show run");

}

}.show(); //寫法和編譯都沒問題

//2

Object obj = new Object(){

void show(){

System.out.println("show run");

}

};

obj.show(); //寫法正確,編譯會報錯

1和2的寫法正確嗎?有區別嗎?說出原因。

寫法是正確,1和2都是在通過匿名內部類建立一個Object類的子類對象。

區別:

第一個可是編譯通過,並運行。

第二個編譯失敗,因為匿名內部類是一個子類對象,當用Object的obj引用指向時,就被提升為了Object類型,而編譯時會檢查Object類中是否有show方法,此時編譯失敗。

(五)Java基礎文本資料整理多態(面向對象特徵之一)

1私信 1

2搜索百戰程序員獲取更多資訊資料


分享到:


相關文章: