多态的综合练习(Java)

文章目录

  • 多态的综合练习(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);}@Overridepublic 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);}@Overridepublic 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);}@Overridepublic 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);}@Overridepublic 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, "鱼");}
}

多态的综合练习(Java)相关推荐

  1. 7-1 sdut-oop-7 答答租车系统(类的继承与多态 面向对象综合练习) (30 分)

    7-1 sdut-oop-7 答答租车系统(类的继承与多态 面向对象综合练习) (30 分) 各位面向对象的小伙伴们,在学习了面向对象的核心概念--类的封装.继承.多态之后,答答租车系统开始营运了. ...

  2. J2SE综合对java util的总结 一

    J2SE综合对java util的总结 一 java.util包中包含了一些在Java 2中新增加的最令人兴奋的增强功能:类集.一个类集(collection)是一组对象.类集的增加使得许多java. ...

  3. java多态app_Java 入门教程 - Java 多态 - IT学院 - 中国软件协会智能应用服务分会...

    Java 多态 本小节我们来学习面向对象的最后一大特征--多态.多态是面向对象最重要的特性.我们将介绍多态的概念和特点,并带领大家实现一个多态的案例,你将了解到多态的实现条件.什么是向上转型以及什么是 ...

  4. 解耦 多态性 java_Java的多态浅谈,Java多态浅谈网站安全分享!

    Java的多态浅谈概述Java的四大基本特性:抽象,封装,继承和多态.其中,抽象,封装,继承可以说多态的基础,而多态是封装,继承的具体表现.如果非要用专业术语来描述什么是多态的话 多态是指程序中定义的 ...

  5. Java面向对象 - 封装、继承和多态的综合练习

    面向对象的三个基本特征: 封装,就是把客观的事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的信息隐藏.隐藏实现细节,使得代码模块化. 继承,可以使用现有类的所有功能 ...

  6. Educoder- 《JAVA从小白到大牛》(第二章)2-3 Java面向对象 - 封装、继承和多态的综合练习

    提示:本文章为个人学习记录,仅供参考学习,禁止转载,支持交流与讨论. 文章目录 第1关:通关任务一 任务描述 相关知识 面向对象思想 封装 继承 `super()`和`this()` 编程要求 测试说 ...

  7. 头歌实践实践教学平台:Java面向对象 - 封装、继承和多态的综合练习

    第1关:封装.继承和多态进阶(一) 任务描述 本关任务:按要求编写一个Java应用程序,巩固Java面向对象知识. 相关知识 为了完成本关任务,我们回顾一下前面所学知识:1.面向对象思想 :2.封装: ...

  8. Java接口实现多态 -- 笔记本电脑综合实例

    前言 在开始分享之前,请大家思考三个问题 . 1,什么是多态? 2,多态有几种实现方式(除了接口还有什么可以实现多态,答案不唯一.) 3,多态的好处 答案:大家可以把自己的见解分享到下面评论里 下面以 ...

  9. 什么是Java多态?如何实现Java多态?

    java多态这个概念在同学们深入学习java的时候就会被提出,很多同学并不知道是什么意思,如何实现.今天小千就来给大家介绍一下什么是java多态和java如何实现多态. 什么是多态? 指允许不同类的对 ...

最新文章

  1. Fastlane实战(一):移动开发自动化之道
  2. Elasticsearch 及 Kibana 安装篇
  3. 关于Rabbitmq的routingkey的作用
  4. diveintopython3 official_Python 学习资料整理
  5. who whos exist inf
  6. [转载] python histogram函数_Python numpy.histogram_bin_edges函数方法的使用
  7. linux使用shell脚本利用expect工具实现SCP传输文件到多台服务器
  8. conda:Could not find a version that satisfies the requirement XXX
  9. 【JAVA语言学习】Java面向对象Ⅲ
  10. 设计,构建线框图和对Android应用进行原型制作:第1部分
  11. 计算机等级二级等保要求
  12. PS 学习笔记 16 -渐变工具组
  13. JAVA和H5的优势有哪些
  14. Android开机动画bootanimation
  15. 【笑小枫的SpringBoot系列】【十五】SpringBoot根据模板生成Word
  16. Python爬取扇贝“【无老师】7天搞定TOEFL单词”
  17. vue中获取短信验证码功能IOS手机问题
  18. 软件测试人员必读的经典书籍(附电子书),前阿里大佬给我推荐...
  19. ABBYY Lingvo European for Mac(万能词典) v1.12.0
  20. Python+Tushare,自制A股筛选器

热门文章

  1. Spatial AI
  2. 45个android实例源码
  3. JDBC 基础、CRUD、分页 第一节
  4. 推荐免费下载大型酒店管理系统源码
  5. 微信订阅消息推送(记录)
  6. php 微信token验证失败,php下微信token验证失败怎么办?
  7. kafka的epoch
  8. 拒绝凌乱桌面 Type-C接口显示器的魅力,乐得瑞LDR6282 USB-C桌面显示器方案帮你实现
  9. Ubuntu18.04切换镜像源时出错
  10. Windows10 CMD SSH登陆不了服务器出现 WARNING: REMOTE HOST