介面 多型 多型的轉型以及方法的呼叫問題

2021-06-28 07:50:36 字數 4767 閱讀 1985

介面的思想:

舉例:膝上型電腦,usb介面的故事。

1,介面的出現對功能是實現了擴充套件。

2,介面的出現定義了規則。

3,介面的出現降低了耦合性(解耦)。

介面的出現,完成了解耦,說明有兩方,一方在使用這個規則,另一方在實現這個規則。

比如膝上型電腦使用這個規則,而外圍裝置在實現這個規則。

描述事物。

犬。按照功能分類。導盲犬,緝毒犬...

犬:吼叫();

吃飯();

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

abstractclass

class緝毒犬extends

publicvoid吃飯(){}

publicvoid緝毒(){}

}

//對於緝毒,有可能還有緝毒豬,具備者緝毒功能,應該將緝毒功能抽取。

//對緝毒進行描述。

abstractclass緝毒

緝毒犬既需要犬的功能又需要緝毒的功能。

無法直接多繼承。

是否可以多實現呢?可以的。

犬是介面,緝毒也是介面。緝毒犬多實現即可。

類負責描述的是事物的基本功能。介面負責描述事物的擴充套件功能。

緝毒犬是犬中一種。is a 關係,

將犬定義成類。而緝毒是犬的乙個擴充套件功能。這時將緝毒定義介面。

這時描述就變成了這樣:

1

2

3

4

5

6

7

8

9

10

11

inte***ce緝毒able

class緝毒犬extendsimplements緝毒able

publicvoid吃飯(){}

publicvoid緝毒(){}

}

小節:

1,抽象類是描述事物的基本功能,可以定義非抽象的方法。

介面中定義只能是抽象方法,負責功能的擴充套件。

2,類與類之間是繼承關係 is a關係。

類與介面之間是實現關係 like a 關係。

1

2

3

4

5

6

7

8

9

10

11

12

open();

close();

報警門。

class

inte***ce報警

多型:【體現】

父類的引用或者介面的引用指向了自己的子類物件。

1

2

dog d =newdog();//dog物件的型別是dog型別。

animal a =newdog();//dog物件的型別右邊是dog型別,左邊animal型別。

【好處】

提高了程式的擴充套件性。

【弊端】

通過父類引用操作子類物件時,只能使用父類中已有的方法,不能操作子類特有的方法。

【前提】

1,必須有關係:繼承,實現。

2,通常都有重寫操作。

【子類的特有方法如何呼叫呢?】

animal a = new dog();//animal是父型別,new dog()是子物件。

但是父型別引用指向子類物件時,這就是讓子類物件進行了型別的提公升(向上轉型)。

向上轉型好處:提高了擴充套件性,隱藏了子型別。弊端:不能使用子型別的特有方法。

如果要想使用子類的特有方法,只有子型別可以用。

可以向下轉型,強制轉換。

1

2

3

4

animal a =newdog();

a.eat();

dog d = (dog)a;//將a轉型為dog型別。向下轉型。

d.lookhome();

向下轉型什麼時候用?當需要使用子型別的特有內容時。

注意:無論向上還是向下轉型,最終都是子類物件做著型別的變化。

【向下轉型的注意事項】

animal a = new dog();

//cat c = (cat)a;向下轉型因為不明確具體子類物件型別,所以容易引發classcastexception異常。

所以為了避免這個問題,需要在向下轉型前,做型別的判斷。

判斷型別用的是關鍵字 instanceof

1

2

3

4

5

6

7

8

9

10

11

if(ainstanceofcat)//a指向的物件的型別是cat型別。

elseif(ainstanceofdog)

【轉型總結】

1,什麼時候使用向上轉型呢?

提高程式的擴充套件性,不關係子型別(子型別被隱藏)。

需要用子類的特有方法嗎?不需要,哦了。向上轉型。

2,什麼時候使用向下轉型呢?

需要使用子型別的特有方法時。

但是一定要使用 instanceof 進行型別的判斷。避免發生 classcastexception

多型方法呼叫注意:

如果student類繼承person類,並且都存在eat方法

1

2

3

4

5

person person=newstudent();

person.eat();//發現子類覆寫了此方法,呼叫子類方法

person.study;//父類沒有此方法,編譯失敗;

student student=(student)person;//person物件向下轉型

student.study;//子類物件有此方法,編譯通過;

當子類物件向上轉型後,呼叫方法時,先看父類物件有沒有方法,有則在看子類是否覆寫,覆寫了呼叫子類方法,沒有覆寫呼叫父類方法,若父類沒有此方法而子類有,則必須向下轉型為子類型別,才能呼叫此方法,否則編譯失敗。

Java 多型的使用以及多型的轉型

多型 同乙個事物 物件 在不同時刻體現出來的不同狀態。例如 狗子是狗子也是動物,水有不同的形態。多型的前提 多型中的成員訪問特點 多型的好處 多型的弊端 乙個簡單的例子,先建立動物類父類,讓小貓類繼承動物類,在主方法中讓父類引用子類的物件,輸出子類中重寫方法的內容。class animal clas...

Java多型的體現 轉型

子類的物件賦值給父類的引用 student s new student person p s 也就是person p new student 乙個引用能夠呼叫哪些成員 變數和方法 取決於這個引用的型別 即父類 乙個引用呼叫的是哪乙個方法,取決於這個引用所指的物件 即子類 將父類的物件賦值給子類的引用...

Java多型性以及上下轉型

問 老虎是動物嗎?那麼動物是老虎嗎?答 老虎當然是動物,動物不一定是老虎。廢話 現在你明白了,原來是這樣 向上轉型 把乙個具體的物種的例項歸為總的動物類。即 動物 動物例項 new 具體物種 向下轉型 把乙個總的動物例項歸為乙個具體的物種。用 來說事吧 動物類 老虎類 繼承 動物類 獅子類 繼承 動...