1. 程式人生 > >java中多型的體現思想

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();
 */

}`