多态的综合练习(Java)-创新互联

多态的综合练习(Java)

成都创新互联从2013年开始,公司以成都网站设计、网站建设、系统开发、网络推广、文化传媒、企业宣传、平面广告设计等为主要业务,适用行业近百种。服务企业客户成百上千家,涉及国内多个省份客户。拥有多年网站建设开发经验。为企业提供专业的网站建设、创意设计、宣传推广等服务。 通过专业的设计、独特的风格,为不同客户提供各种风格的特色服务。文章目录
  • 多态的综合练习(Java)
      • 【题目描述】
      • 【思路】
      • 【代码实现】
      • 【思考】
      • 【总代吗】

【题目描述】
  1. 定义Dog类

    ​ 属性:

    ​ 年龄(age)、颜色(color)

    ​ 行为:

    ​ eat(String something)(something表示吃的东西)

    ​ 看家lookHome方法(无参数)

  2. 定义Cat类

    ​ 属性:

    ​ 年龄(age)、颜色(color)

    ​ 行为;

    ​ eat(String something)(something代表吃的东西)

    ​ 逮老鼠catchMouse方法(无参数)

  3. 定义Person类

    ​ 属性:

    ​ 姓名(name)、年龄(age)

​ 行为:

​ keepPet(Dog dog,String something)方法

​ 功能:喂养宠物狗,something表示喂养的东西

​ 行为:

​ keepPet(Cat cat,String something)方法

​ 功能:喂养宠物猫,something表示喂养的东西

​ 生成空参有参构造,set和get方法

  1. 定义测试类(完成以下打印效果)

    ​ 属性:

    ​ keepPet(Dog dog,String something)方法打印内容如下:

    ​ 年龄为30岁的老王养了一只黑色的3岁的狗

    ​ 3岁的黑色的狗两只前脚死死地抱住骨头猛吃

    ​ keepPet(Cat cat,String something)方法打印内容如下:

    ​ 年龄为30岁的老王养了一只白色的2岁的猫

    ​ 2岁的白色的猫眯着眼睛侧着头吃鱼

  2. 思考:

    1. Dog和Cat都是Animal的子类,以上案例中针对不同的动物,定义了不同的keepPet方法,过于繁琐,能否简化,并体会简化的好处?
    2. Dog和Cat虽然都是Animal的子类,但是都有其特有方法,能否想办法在keepPet中调用特有方法
【思路】
  • Dog类和Cat类有相同的属性和行为,因此可以把Dog类和Cat来放到一个父类里,优化代码
  • Dog类和Cat类都有自己特有的行为,因此在定义类的时候要单独编写特有的类
  • Dog类和Cat类的eat行为虽然看起来一样,但是在后面的输出内容看出来,这两的输出格式并不是一样的,因此需要进行重写
  • Person类因为没有和Dog类以及Cat类相同的属性和行为,所以不能和Dog类和Cat类一样放到同一个父类下
【代码实现】

表情包

第一步,根据Dog类和Cat类的相同的属性和行为创建他们的父类Animal类,Animal类里应该要写好共有的属性并且要进行封装,接着还要写好eat行为。写好父类后要写Dog类和Cat类。这两个类在继承Animal类的时候要注意加关键字extends。并且还要对eat行为进行重写,此时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() + "色的猫眯着眼睛侧着头吃着" + something);
    }

    public void catchMouse() {System.out.println("猫抓老鼠");
    }
}

注意Dog类和Cat类主要的成员变量已经在父类中定义过了,可以直接调用,但是要注意有superl来说明来自父类

第二步,根绝要求创建Person类。Person类的属性就是name、age,行为就keepPet。但是keepPet主要是针对两个类的,所以要进行重载。

//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() + "养了一只" + dog.getColor() + "的" + dog.getAge() + "岁的狗");
        dog.eat(something);
    }

    public void keepPet(Cat cat, String something) {System.out.println("年龄为" + getAge() + "岁的" + getName() + "养了一只" + cat.getColor() + "的" + cat.getAge() + "岁的猫");
        cat.eat(something);
    }
}

第三步,在主函数中创建初始化Dog、Cat、Person,最后直接调用Person下的方法,进行输出

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中调用特有方法

  1. 当子类过多的时候,我们一个一个的定义胡话会过于麻烦,不仅如此,还要写很多行代码。为了处理这种情况,我们可以进行一些转化。

    当子类过多的时候,我们可以直接用他们的父类作为形参对keepPet进行进行一些修改。

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() + "养了一只" + a.getColor() + "的" + a.getAge() + "岁的动物");
        a.eat(something);
    }
}

注意此时的代码有几个弊端:1. 输出的时候没法说明在这里进行说明是什么动物,只能用“动物”来代替父类中的所有子类;2. 不能调用各个子类的特有的方法,只能调用在父类中已经写好的方法;

面对上述问题可以进行强转,将进入的类型强转成需要的类型,这里主要是用到了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() + "养了一只" + a.getColor() + "的" + a.getAge() + "岁的狗");
            d.eat(something);
        } else if (a instanceof Cat c) {System.out.println("年龄为" + getAge() + "岁的" + getName() + "养了一只" + c.getColor() + "的" + c.getAge() + "岁的猫");
            c.eat(something);
        }else{System.out.println("没有这种动物");
        }
    }
}

注意利用intanceof将父类转化成子类之前,要确定这俩确定是继承关系

【总代吗】
//父类
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() + "色的猫眯着眼睛侧着头吃着" + 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() + "养了一只" + a.getColor() + "的" + a.getAge() + "岁的狗");
            d.eat(something);
        } else if (a instanceof Cat c) {System.out.println("年龄为" + getAge() + "岁的" + getName() + "养了一只" + 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, "鱼");
    }
}

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


名称栏目:多态的综合练习(Java)-创新互联
本文来源:http://ybzwz.com/article/gcpee.html