介面的思想:
舉例:膝上型電腦,usb介面的故事。
1,介面的出現對功能是實現了擴充套件。
2,介面的出現定義了規則。
3,介面的出現降低了耦合性(解耦)。
介面的出現,完成了解耦,說明有兩方,一方在使用這個規則,另一方在實現這個規則。
比如膝上型電腦使用這個規則,而外圍裝置在實現這個規則。
描述事物。
犬。按照功能分類。導盲犬,緝毒犬...
犬:吼叫();
吃飯();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
abstract
class
犬
class
緝毒犬
extends
犬
public
void
吃飯(){}
public
void
緝毒(){}
}
//對於緝毒,有可能還有緝毒豬,具備者緝毒功能,應該將緝毒功能抽取。
//對緝毒進行描述。
abstract
class
緝毒
緝毒犬既需要犬的功能又需要緝毒的功能。
無法直接多繼承。
是否可以多實現呢?可以的。
犬是介面,緝毒也是介面。緝毒犬多實現即可。
類負責描述的是事物的基本功能。介面負責描述事物的擴充套件功能。
緝毒犬是犬中一種。is a 關係,
將犬定義成類。而緝毒是犬的乙個擴充套件功能。這時將緝毒定義介面。
這時描述就變成了這樣:
1
2
3
4
5
6
7
8
9
10
11
inte***ce
緝毒able
class
緝毒犬
extends
犬
implements
緝毒able
public
void
吃飯(){}
public
void
緝毒(){}
}
小節:
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 =
new
dog();
//dog物件的型別是dog型別。
animal a =
new
dog();
//dog物件的型別右邊是dog型別,左邊animal型別。
【好處】
提高了程式的擴充套件性。
【弊端】
通過父類引用操作子類物件時,只能使用父類中已有的方法,不能操作子類特有的方法。
【前提】
1,必須有關係:繼承,實現。
2,通常都有重寫操作。
【子類的特有方法如何呼叫呢?】
animal a = new dog();//animal是父型別,new dog()是子物件。
但是父型別引用指向子類物件時,這就是讓子類物件進行了型別的提公升(向上轉型)。
向上轉型好處:提高了擴充套件性,隱藏了子型別。弊端:不能使用子型別的特有方法。
如果要想使用子類的特有方法,只有子型別可以用。
可以向下轉型,強制轉換。
1
2
3
4
animal a =
new
dog();
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
(a
instanceof
cat)
//a指向的物件的型別是cat型別。
else
if
(a
instanceof
dog)
【轉型總結】
1,什麼時候使用向上轉型呢?
提高程式的擴充套件性,不關係子型別(子型別被隱藏)。
需要用子類的特有方法嗎?不需要,哦了。向上轉型。
2,什麼時候使用向下轉型呢?
需要使用子型別的特有方法時。
但是一定要使用 instanceof 進行型別的判斷。避免發生 classcastexception
多型方法呼叫注意:
如果student類繼承person類,並且都存在eat方法
1
2
3
4
5
person person=
new
student();
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 具體物種 向下轉型 把乙個總的動物例項歸為乙個具體的物種。用 來說事吧 動物類 老虎類 繼承 動物類 獅子類 繼承 動...