JAVA.SE面向對象(多態)

1.多態

1.1多態的概述

面向對象的三大特徵:
封裝,繼承,多態
多態:同一個事物的不同表現形式,同一個對象不同的表現形態

1.2多態的前提條件

必須有繼承或者實現關係
必須有方法的重寫
父類的類型指向了子類的類型

Fu f = new Zi();
接口 類名 = new 實現類();

1.3 多態方法的特徵

編譯看父類,運行看子類
或者說編譯看左邊,運行看右邊

	Animal 動物類  Dog 狗類 
    Animal an1 = new Dog();  

	Animal 動物類  Cat 貓類 
    Animal an2 = new Cat();
    package com.ithema.Text04;

public abstract class Fu {
    private  String name;
    private int age;

    public Fu() {
    }

    public Fu(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void eat() {
        System.out.println("父類的喫飯!");
    }
    public void drink() {
        System.out.println("父類的喝水");

    }

    public abstract void fly();
    @Override
    public String toString() {
        return "Fu{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

package com.ithema.Text04;

public interface Fu01 {
    public abstract void swim();

    void pingpang();
}
package com.ithema.Text04;

public class shixian implements Fu01 {

    @Override
    public void swim() {
        System.out.println("實現類的swim");
    }

    @Override
    public void pingpang() {
        System.out.println("實現類的pingpang");
    }
}
package com.ithema.Text04;

public class Zi extends Fu {
    public Zi() {
    }

    public Zi(String name, int age) {
        super(name, age);
    }

    @Override
    public void fly() {
        System.out.println("子類的實現類飛");

    }

    @Override
    public void drink() {
        super.drink();
    }

    @Override
    public void eat() {
        super.eat();
    }
}
package com.ithema.Text04;

public class Zi02 extends Fu {
    public Zi02() {
    }

    public Zi02(String name, int age) {
        super(name, age);
    }

    @Override
    public void eat() {
        super.eat();
    }

    @Override
    public void drink() {
        super.drink();
    }

    @Override
    public void fly() {
        System.out.println("子類02的飛");
    }
}
package com.ithema.Text04;

public class Demo01 {
    public static void main(String[] args) {
        Fu f = new Zi("張三",18);
        f.drink();
        f.eat();
        f.fly();
        System.out.println(f);
        Fu f1 = new Zi02("李四",20);
        System.out.println(f1);
        f1.eat();
        f1.fly();
        f1.drink();
    }
}

1.4多態的好處

提高了代碼的靈活性
提高了代碼的拓展性

1.5多態的弊端

使用父類只能調用父類子類都有的方法,不能調用子類特有方法

1.6多態的弊端解決方案

把子類轉換爲父類(向下轉型)

	 Animal an = new Dog();
        an.eat();
        //2.向下轉型
        Dog dd = (Dog)an;
        dd.看家();

在這裏插入圖片描述## 1.7instanceof關鍵字的作用
可以判斷是否爲指定對象

package com.ithema.Text05;

public class Animal {
    public void eat() {
        System.out.println("父類的喫");

    }

}
package com.ithema.Text05;

public class Cat extends Animal {
    public void takemouse() {
        System.out.println("捉老鼠");
    }
}
package com.ithema.Text05;

public class Dog extends Animal {
    public Dog() {
    }
    public void kanjia() {
        System.out.println("狗看家");
    }

}

package com.ithema.Text05;

public class Demo01 {
    public static void main(String[] args) {
        Animal d = new Dog();
        Animal c = new Cat();
       // Cat c2 = (Cat) c;

        d.eat();
       // Dog d2 = (Dog) d;
        //
        if (d instanceof Dog) {
            Dog d1 = (Dog) d;
            d1.kanjia();


        }
        if (c instanceof Cat) {
            Cat c1 = (Cat) c;
            c1.takemouse();
        }
    }
}

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