本项目是黑马P132继承与多态练习,独立完成。Java的三大特性是封装、继承和多态。
练习题目:
1.定义狗类
属性:年龄、颜色
行为:eat(String something)(something表示吃的东西)
看家lookHome方法(无参数)
2.定义猫类
属性:年龄、颜色
行为:eat(String something)(something表示吃的东西)
抓老鼠catchMouse方法(无参数)
3.定义Person类//饲养员
属性:姓名、年龄
行为:keepPet(Dog dog,String something)方法
keepPet(Cat cat,String something)方法
生成有参空参构造,set和get方法
4.定义测试类(完成以下打印效果):
keepPet(Dog dog,String something)打印如下内容:
年龄为30岁的老王养了一只黑颜色的2岁的狗
2岁的黑颜色的狗两只前腿死死的抱住骨头猛吃
keepPet(Cat cat,String something)打印如下内容:
年龄为25岁的老李养了一只灰颜色的3岁的猫
3岁的灰颜色的猫眯着眼睛侧着头吃鱼
先提取共性内容形成父类Animal,Animal中包含两个私有变量年龄和颜色,设置无参和有参的构造方法,set和get方法以及eat方法。
package demo03;
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);
}
}
然后是猫类和狗类的实现。猫和狗通过extends Animal进行对Animal类的继承。在有参构造函数中,使用super(age,color)方法,即可在本类和别的类中通过get方法获得父类中的私有变量。使用@Override,重写eat()方法。由于子类可以直接调用父类中的public函数,所以可以直接通过getAge()方法和getColor()方法获得对应的内容。
package demo03;
public class Dog extends Animal{
public Dog(int age,String color){
super(age, color);
}
public Dog() {
}
@Override
public void eat(String something){
System.out.println(getAge() + "岁的" + getColor() + "颜色的狗两只前腿死死的抱住" + something + "猛吃");
}
public void lookHome(){
System.out.println("狗看家");
}
}
package demo03;
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() + "颜色的猫眯着眼睛侧着头吃" + something);
}
public void catchMouse(){
System.out.println("猫在抓老鼠");
}
}
然后是Person类的实现。完成构造函数、get/set方法后,定义KeepPet方法,这里利用多态,将形参的第一项定义为Animal a,在测试类调用时,就可以将new Dog()或new Cat()作为实参传入。通过a instanceof Dog和a instanceof Cat方法,判断传入的参数是Dog类还是Cat类的对象。如果采用的是重写的方法,直接通过a.调用即可。如果是子类特有的方法,需要强制转换成子类的对象。由于是向下转换,需要强制转换,例如:Dog d = (Dog)a;然后就可以调用d.lookHome()方法。
public void KeepPet(Animal a,String something){
//a = new Dog(2,"黑颜色");
if(a instanceof Dog){
System.out.println("年龄为" + age + "岁的" + name + "养了一只" + a.getColor() + "颜色的" + a.getAge() + "岁的狗");
//Dog d = (Dog)a;
a.eat(something);
}
else if(a instanceof Cat){
System.out.println("年龄为" + age + "岁的" + name + "养了一只" + a.getColor() + "颜色的" + a.getAge() + "岁的猫");
a.eat(something);
}
}
最后是测试类:
package demo03;
public class Test {
public static void main(String[] args) {
Person p1 = new Person("老王",30);
Person p2 = new Person("老李",25);
p1.KeepPet(new Dog(2,"黑"),"骨头");
p2.KeepPet(new Cat(3,"灰"),"鱼");
}
}