java中多型的體現思想
我們都知道,面向物件有三大特徵:封裝,繼承,多型;
多型:就是指相同的事物的不同狀態,比如:水。水可以有三種狀態。那麼在JAVA中的多型也可以理解成這個意思,就是:
將父物件設定成為和一個或多個它的子物件相等的技術,
比如Animal = Dog;
當滿足這三個條件 1.有繼承 2. 有重寫 3. 要有父類引用指向子類物件,就有多型的影子;
多型性使得能夠利用同一類(父類)引用不同類的物件,
以及根據所引用物件的不同,以不同的方式執行相同的操作。
多型實現包括兩種方式:過載和重寫
例如:Animal a = new Dog();
父類引用指向子類物件,Animal類中包含一個eat()方法,而 Dog類繼承自
Animal類,如果子類重寫了父類的eat()方法,則呼叫的時候,就可以按照子類
的形式呼叫,本質上是父類的方法,但是子類重寫之後,就成了另一種方式,
這就是多型。
轉型:
* 向上轉型,父類的引用指向子類的物件
通俗的說就是將子類物件轉換為父類物件,此處的父類物件可以是介面
* 向下轉型,把指向子類物件的父類引用賦值給子類的引用(要強制轉換)
*
舉個例子:
`package com.tr;
class Animal{
//描述動物,動物有吃飯,跑的行為
public void eat(){
System.out.println(“父類吃的方法!!”);
}
public void run(){
System.out.println(“父類跑的方法!!”);
}
}
class Dog extends Animal{
//描述狗,同樣的有吃飯,看家,睡覺的屬性
public void eat(){
System.out.println(“子類dog吃的方法!!!”);
}
public void housekeeping(){
System.out.println(“子類dog看家的方法”);
}
public void sleep(){
System.out.println(“子類dog睡覺的方法”);
}
}
class Ma extends Animal{
//描述狗,有吃飯喝水的行為
public void chi(){
System.out.println(“Ma吃的方法”);
}
public void he(){
System.out.println(“Ma喝的方法”);
}
}
public class DuotaiDemo {
public static void main(String[] args) { //父類的引用指向子類的物件,而不能是子類的而子類的引用不能指向父類的物件 //能說dog是動物,而不能說動物就是dog /** * 向上轉型,父類的引用指向子類的物件 * 通俗的說就是將子類物件轉換為父類物件,此處的父類物件可以是介面 */ Animal a = new Dog(); //a.eat();; //注意,向上轉型之後子類a會遺失除與父類共有的其他方法,比如在這 a調不到housekeeping方法和sleep方法 /** * 向下轉型,把指向子類物件的父類引用賦值給子類的引用(要強制轉換) * 首先要向上轉型,然後在向下轉型,兩個步驟 * 向下轉型之後d能調到父類和子類的所有公有方法 * Girl g2=new Girl(); * MMGirl mmg1=(MMGirl)g2; //不安全的向下轉型,編譯無錯但會執行會出錯 * 執行出錯: * Exception in thread "main" java.lang.ClassCastException: com.wensefu.other1.Girl * at com.wensefu.other1.Main.main(Girl.java:36) * 如程式碼所示,可以通過instanceof來防止出現異常 */ Dog d =(Dog)a; d.run(); d.eat(); d.housekeeping(); d.sleep(); } /** * 有多個狗和馬物件都要呼叫吃飯這個方法,這樣會使 * d.eat()程式碼重複性非常嚴重 * Dog d = new Dog() * d.eat() * d.housekeeping(); d.sleep(); * 為了提高程式碼的複用性,可以將d.eat()封裝起來 } 然後建立物件,直接呼叫fun()方法即可 public static void fun2(Dog d){ d.eat(); d.housekeeping(); d.sleep(); } fun2(new Dog()); //static方法在同一個類中可以直接方法名調,不同類中要 類名.方法名 呼叫,要 public 修飾的 public static void fun3(Ma m){ m.eat(); m.chi(); m.he(); } * public static void fun1(Animal h){ h.eat(); */
}`