
【思路】
定義Dog類
? 屬性:
? 年齡(age)、顏色(color)
? 行為:
? eat(String something)(something表示吃的東西)
? 看家lookHome方法(無參數(shù))
定義Cat類
? 屬性:
? 年齡(age)、顏色(color)
? 行為;
? eat(String something)(something代表吃的東西)
? 逮老鼠catchMouse方法(無參數(shù))
定義Person類
? 屬性:
? 姓名(name)、年齡(age)
? 行為:
? keepPet(Dog dog,String something)方法
? 功能:喂養(yǎng)寵物狗,something表示喂養(yǎng)的東西
? 行為:
? keepPet(Cat cat,String something)方法
? 功能:喂養(yǎng)寵物貓,something表示喂養(yǎng)的東西
? 生成空參有參構(gòu)造,set和get方法
定義測試類(完成以下打印效果)
? 屬性:
? keepPet(Dog dog,String something)方法打印內(nèi)容如下:
? 年齡為30歲的老王養(yǎng)了一只黑色的3歲的狗
? 3歲的黑色的狗兩只前腳死死地抱住骨頭猛吃
? keepPet(Cat cat,String something)方法打印內(nèi)容如下:
? 年齡為30歲的老王養(yǎng)了一只白色的2歲的貓
? 2歲的白色的貓瞇著眼睛側(cè)著頭吃魚
思考:
- Dog和Cat都是Animal的子類,以上案例中針對不同的動物,定義了不同的keepPet方法,過于繁瑣,能否簡化,并體會簡化的好處?
- Dog和Cat雖然都是Animal的子類,但是都有其特有方法,能否想辦法在keepPet中調(diào)用特有方法

第一步,根據(jù)Dog類和Cat類的相同的屬性和行為創(chuàng)建他們的父類Animal類,Animal類里應(yīng)該要寫好共有的屬性并且要進(jìn)行封裝,接著還要寫好eat行為。寫好父類后要寫Dog類和Cat類。這兩個類在繼承Animal類的時候要注意加關(guān)鍵字extends。并且還要對eat行為進(jìn)行重寫,此時eat行為的重寫要注意輸出時候的格式類型
//父類
public class Animal {private int age;
    private String color;
    public Animal() {}
    public Animal(int age, String color) {this.age = age;
        this.color = color;
    }
    public int getAge() {return age;}
    public void setAge(int age) {this.age = age;
    }
    public String getColor() {return color;
    }
    public void setColor(String color) {this.color = color;
    }
    public void eat(String something) {System.out.println("動物在吃" + something);
    }
}//Dog類
public class Dog extends Animal {public Dog() {}
    public Dog(int age, String color) {super(age, color);
    }
    @Override
    public void eat(String something) {System.out.println(getAge() + "歲的" + getColor() + "色的狗兩只前腳死死地抱住" + something + "猛吃");
    }
    public void lookhome() {System.out.println("狗在看家");
    }
}//Cat類
public class Cat extends Animal {public Cat() {}
    public Cat(int age, String color) {super(age, color);
    }
    @Override
    public void eat(String something) {System.out.println(getAge() + "歲的" + getColor() + "色的貓瞇著眼睛側(cè)著頭吃著" + something);
    }
    public void catchMouse() {System.out.println("貓抓老鼠");
    }
}注意Dog類和Cat類主要的成員變量已經(jīng)在父類中定義過了,可以直接調(diào)用,但是要注意有superl來說明來自父類
第二步,根絕要求創(chuàng)建Person類。Person類的屬性就是name、age,行為就keepPet。但是keepPet主要是針對兩個類的,所以要進(jìn)行重載。
//Person類
public class Person {private String name;
    private int age;
    public Person() {}
    public Person(String name, int age) {this.name = name;
        this.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;
    }
    public void keepPet(Dog dog, String something) {System.out.println("年齡為" + getAge() + "歲的" + getName() + "養(yǎng)了一只" + dog.getColor() + "的" + dog.getAge() + "歲的狗");
        dog.eat(something);
    }
    public void keepPet(Cat cat, String something) {System.out.println("年齡為" + getAge() + "歲的" + getName() + "養(yǎng)了一只" + cat.getColor() + "的" + cat.getAge() + "歲的貓");
        cat.eat(something);
    }
}
第三步,在主函數(shù)中創(chuàng)建初始化Dog、Cat、Person,最后直接調(diào)用Person下的方法,進(jìn)行輸出
public class Main {public static void main(String[] args) {Person p = new Person("老王", 20);
        Dog dog = new Dog(1, "黑");
        Cat cat = new Cat(2, "白");
        p.keepPet(dog, "骨頭");
        p.keepPet(cat, "魚");
    }
}
Dog和Cat都是Animal的子類,以上案例中針對不同的動物,定義了不同的keepPet方法,過于繁瑣,能否簡化,并體會簡化的好處?
Dog和Cat雖然都是Animal的子類,但是都有其特有方法,能否想辦法在keepPet中調(diào)用特有方法
當(dāng)子類過多的時候,我們一個一個的定義胡話會過于麻煩,不僅如此,還要寫很多行代碼。為了處理這種情況,我們可以進(jìn)行一些轉(zhuǎn)化。
當(dāng)子類過多的時候,我們可以直接用他們的父類作為形參對keepPet進(jìn)行進(jìn)行一些修改。
public class Person {private String name;
    private int age;
    public Person() {}
    public Person(String name, int age) {this.name = name;
        this.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;
    }
    public void keepPet(Animal a,String something){System.out.println("年齡為" + getAge() + "歲的" + getName() + "養(yǎng)了一只" + a.getColor() + "的" + a.getAge() + "歲的動物");
        a.eat(something);
    }
}
注意此時的代碼有幾個弊端:1. 輸出的時候沒法說明在這里進(jìn)行說明是什么動物,只能用“動物”來代替父類中的所有子類;2. 不能調(diào)用各個子類的特有的方法,只能調(diào)用在父類中已經(jīng)寫好的方法;
面對上述問題可以進(jìn)行強(qiáng)轉(zhuǎn),將進(jìn)入的類型強(qiáng)轉(zhuǎn)成需要的類型,這里主要是用到了intanceof
public class Person {private String name;
    private int age;
    public Person() {}
    public Person(String name, int age) {this.name = name;
        this.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;
    }
    public void keepPet(Animal a, String something) {if (a instanceof Dog d) {System.out.println("年齡為" + getAge() + "歲的" + getName() + "養(yǎng)了一只" + a.getColor() + "的" + a.getAge() + "歲的狗");
            d.eat(something);
        } else if (a instanceof Cat c) {System.out.println("年齡為" + getAge() + "歲的" + getName() + "養(yǎng)了一只" + c.getColor() + "的" + c.getAge() + "歲的貓");
            c.eat(something);
        }else{System.out.println("沒有這種動物");
        }
    }
}
注意利用intanceof將父類轉(zhuǎn)化成子類之前,要確定這倆確定是繼承關(guān)系

//父類
public class Animal {private int age;
    private String color;
    public Animal() {}
    public Animal(int age, String color) {this.age = age;
        this.color = color;
    }
    public int getAge() {return age;}
    public void setAge(int age) {this.age = age;
    }
    public String getColor() {return color;
    }
    public void setColor(String color) {this.color = color;
    }
    public void eat(String something) {System.out.println("動物在吃" + something);
    }
}//Dog類
public class Dog extends Animal {public Dog() {}
    public Dog(int age, String color) {super(age, color);
    }
    @Override
    public void eat(String something) {System.out.println(getAge() + "歲的" + getColor() + "色的狗兩只前腳死死地抱住" + something + "猛吃");
    }
    public void lookhome() {System.out.println("狗在看家");
    }
}//Cat類
public class Cat extends Animal {public Cat() {}
    public Cat(int age, String color) {super(age, color);
    }
    @Override
    public void eat(String something) {System.out.println(getAge() + "歲的" + getColor() + "色的貓瞇著眼睛側(cè)著頭吃著" + something);
    }
    public void catchMouse() {System.out.println("貓抓老鼠");
    }
}//Person類
public class Person {private String name;
    private int age;
    public Person() {}
    public Person(String name, int age) {this.name = name;
        this.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;
    }
    public void keepPet(Animal a, String something) {if (a instanceof Dog d) {System.out.println("年齡為" + getAge() + "歲的" + getName() + "養(yǎng)了一只" + a.getColor() + "的" + a.getAge() + "歲的狗");
            d.eat(something);
        } else if (a instanceof Cat c) {System.out.println("年齡為" + getAge() + "歲的" + getName() + "養(yǎng)了一只" + c.getColor() + "的" + c.getAge() + "歲的貓");
            c.eat(something);
        }else{System.out.println("沒有這種動物");
        }
    }
}//測試類
public class Main {public static void main(String[] args) {Person p = new Person("老王", 20);
        Dog dog = new Dog(1, "黑");
        Cat cat = new Cat(2, "白");
        p.keepPet(dog, "骨頭");
        p.keepPet(cat, "魚");
    }
}你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
                網(wǎng)站標(biāo)題:多態(tài)的綜合練習(xí)(Java)-創(chuàng)新互聯(lián)
                
                當(dāng)前路徑:http://chinadenli.net/article44/gcpee.html
            
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、動態(tài)網(wǎng)站、關(guān)鍵詞優(yōu)化、網(wǎng)站導(dǎo)航、品牌網(wǎng)站制作、網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容
