java學習筆記-多態

Java面向對象的四大特性

繼承 封裝 多態 (抽象)

多態

同一個對象 體現出來的多種不同形態(身份) 將一種行爲表現出不同的效果
要想實現多態的效果 需要現有繼承關係

體現:
  1.父類類型的引用 指向 子類的對象
   Person p = new Teacher();
  2.該引用只能調用父類中定義的屬性或方法
  3.如果子類中將父類的方法重寫,那麼調取方法後執行的結果是子類重寫之後的那個結果
   如果父類與子類有同名的屬性  執行父類的屬性
   如果父類與子類有同名的方法(重載)  執行子類重寫之後的方法
  4.若想要調用子類中獨有的成員
   (強制類型轉化) 造型 鑄型 (向上/向下轉型)
  5.造型時(強制向下轉型時) 可能會出現一個運行時異常
   ClassCastException 造型 鑄型 異常
   如果想要避免造型的異常 可以用instanceof關鍵字來進行判斷
   對象 instanceof 類

案例

//動物類
public class Animal {
    public String name = "Animal的name屬性";

    public void eat(){
        System.out.println("animal的喫飯方法");
    }
    public void sleep(){
        System.out.println("animal的睡覺方法");
    }
}

//人類
public class Person extends Animal{
    public String name = "person的name屬性";
    public void eat(){
        System.out.println("person的喫飯方法");
    }
    public void sleep(){
        System.out.println("人類的睡覺方法");
    }
    public void talk(){
        System.out.println("人類的說話方法");
    }
}

//豬
public class Pig extends Animal{
    public String name = "pig的name屬性";
    public void sleep(){
        System.out.println("豬的睡覺方法");
    }
}

//學生
public class Student extends Person {
    public String name = "student的name屬性";
    public void talk(){
        System.out.println("學生遵守禮貌 應該好好說話");
    }
    public void study(){
        System.out.println("好好學習 天天向上");
    }
}

//老師
public class Teacher extends Person{
    public String name = "teacher的name屬性";
    public void eat(){
        System.out.println("做老師的通常不按時喫飯");
    }
    public void teach(){
        System.out.println("做老師的獨有方法 一般人不會講課 我會");
    }
}

public class Test {
    public static void main(String[] args){
        //1.創建對象
        //這個真是的老師 體現出來的身份是一個人的身份
//        Person p = new Teacher();//自動向上轉型  Teacher--->Person
//        p.eat();
//        p.sleep();
//        p.talk();
//        //如果想要調用子類獨有的屬性或方法
//        //需要將類型還原會真實類型    強制類型轉化  造型  向上轉型  向下轉型
//        Teacher t = (Teacher)p;
//        t.eat();
//        t.sleep();
//        t.talk();
//        t.teach();

        Object o = new Teacher();
        o.hashCode();
        o.toString();
        System.out.println("------------------------");
        Animal a = (Animal)o;
        a.hashCode();
        a.toString();
        System.out.println(a.name);//animal的name屬性
        a.sleep();//沒有重寫  person重寫了 person的sleep
        a.eat();//執行teacher的eat方法
        System.out.println("-----------------------");
        Person p = (Person)o;
        p.hashCode();
        System.out.println(p.name);//person的name屬性
        p.sleep();//人類的睡覺
        p.eat();//老師的喫飯
        p.talk();//人類的說話
        System.out.println("----------------------");
        Teacher t = (Teacher)o;
        System.out.println(t.name);//老師的name
        t.eat();//老師的喫飯
        t.sleep();//人類睡覺
        t.talk();//人類說話
        t.teach();//老師的獨有方法
        System.out.println("-------------------");
        if(o instanceof Person){//對象是否屬於後面類型
            System.out.println("類型匹配  可以造型");
//            Student s = (Student)o;//運行時異常 ClassCastException
//            s.study();
        }else{
            System.out.println("對不起 類型不匹配 不幫您造型啦 否則會出問題");
        }

    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章