1. 程式人生 > 實用技巧 >繼承和多型

繼承和多型

封裝回顧

概念:屬性私有化(private),提供公共(public)setter&getter方法訪問私有屬性。
目的:提高資料的安全性。(額外進行控制)
抽象

前提:具有相同屬性和方法。
場景:物件 -> 類 、類 -> 父類
繼承

父類:類抽象的到父類,必須滿足is-a關係。
圖片描述

都是類(class),父類更抽象、子類更具體。

繼承:將相同的屬性和方法抽象到父類中,子類繼承(extends)父類,子類就可以繼承父類中public+protected型別的的屬性和方法。

繼承優點:提高維護性和擴充套件性。

子類會預設呼叫父類無引數的構造方法。

重寫:父子類中,方法名、引數、返回值都相同。許可權不能縮小。

多型

eg:

public class Dog extends Pet{
    public Dog(String kind){
        super(kind);//呼叫父類構造方法
    }

    @Override
    public String bark(){
        return getName() + "在叫:汪汪";
    }

    public void loolDoor(){
        System.out.println(getName() + "在看門");
    }

}
public class Cat extends Pet{
    public Cat(String kind){
        super(kind);
    }

    @Override
    public String bark(){
        return super.bark() + "喵喵";
    }

    public void catchMouse(){
        System.out.println(getName() + "在捉老鼠");
    }

}
public class Pet {
    //屬性
    private String name;
    private int age;
    private String sex;
    private String kind;

    //初始化塊
    {
        this.name = "未知";
    }

    //構造方法(方法過載)
    public Pet(String kind) {
        this.kind = kind;
    }

    //成員方法
    public void eat(String food){
        System.out.println(name + "在吃" + food);
    }

    public void sleep(){
        System.out.println(name + "在睡覺");
    }

    public String bark(){
        return name + "在叫:";
    }

    //getter&setter方法
    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if(age >= 20 || age < 0){
            System.out.println("資料錯誤!");
        }else{
            this.age = age;
        }
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getKind() {
        return kind;
    }
}
public class Master {
    public static void main(String[] args) {
        Dog pet1 = new Dog("金毛");
        pet1.setName("旺財");
        pet1.eat("骨頭");
        ((Dog)pet1).loolDoor();
        System.out.println(pet1.bark());

        Cat pet2 = new Cat("波斯");
        pet2.setName("咪咪");
        pet2.eat("魚");
        ((Cat)pet2).catchMouse();
        System.out.println(pet2.bark());

    }   
}