【思路】
定義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)查看詳情吧