解析java多态经典习题

1 题目一

1.1 题目内容

编写程序实现乐手弹奏乐器。乐手可以弹奏不同的乐器从
而发出不同的声音。
可以弹奏的乐器包括二胡、钢琴和琵琶。
实现思路及关键代码:
①定义乐器类Instrument,包括方法makeSound()
②定义乐器类的子类:二胡Erhu、钢琴Piano和
小提琴Violin
③定义乐手类Musician,可以弹奏各种乐器
play(Instrument i)
④定义测试类,给乐手不同的乐器让他弹奏

1.2 示例代码

Instrument类

package Work03;
public class Instrument {public void makeSound(){System.out.println("乐器在奏乐");}
}

Erhu类

package Work03;public class Erhu extends Instrument{@Overridepublic void makeSound() {System.out.println("二胡,弹奏的曲目是二泉映月");}
}

Piano类

package Work03;public class Piano extends Instrument{@Overridepublic void makeSound() {System.out.println("钢琴,弹奏的曲目是致爱丽丝");}
}

Violin类

package Work03;public class Violin extends Instrument{@Overridepublic void makeSound() {System.out.println("小提琴,弹奏的曲目是沉思");}
}

Muscian类

package Work03;public class Musician {private String  name;public Musician() {}public Musician(String name) {this.name = name;}public void play(Instrument i){System.out.print(name+"弹奏的乐器是");i.makeSound();}
}

Test类

package Work03;
public class Test {public static void main(String[] args) {Musician m=new Musician("张三");m.play(new Piano());m.play(new Erhu());m.play(new Violin());}
}

1.3 示例代码运行截图

2 题目二

2.1 题目内容

编写程序实现主人喂养宠物和跟宠物玩耍的场景
定义宠物类Pet,宠物都需要吃东西,跟主人玩。
定义狗类Dog、猫类Cat、Dolphin海豚类继承Pet宠物类。
狗狗吃骨头、猫咪吃老鼠、海豚吃乌贼。

主人和宠物的玩耍是每个宠物都独有一份

主人跟狗狗完抓飞盘,主人跟猫咪玩抓老鼠、主人跟海豚玩转圈圈。

2.2 示例代码

Pet类

package Work03;
//上课练习
public class Pet {private String name;public Pet() {}public Pet(String name) {this.name = name;}//吃的方法public void eat(){}public String getName() {return name;}public void setName(String name) {this.name = name;}
}

Dog类

package Work03;public class Dog extends Pet{public Dog() {}public Dog(String name) {super(name);}public void catchDisc() {System.out.println("玩抓飞盘");}@Overridepublic void eat() {System.out.println("狗狗在啃骨头");}
}

Cat类

package Work03;public class Cat extends Pet{public Cat() {}public Cat(String name) {super(name);}public void catchMouse() {System.out.println("玩抓老鼠");}@Overridepublic void eat() {System.out.println("猫咪吃老鼠");}
}

Dolphin类

package Work03;public class Dolphin extends Pet{public Dolphin() {}public Dolphin(String name) {super(name);}public void runningCircle() {System.out.println("玩转圈圈");}@Overridepublic void eat() {System.out.println("海豚吃乌贼");}
}

Master类

package Work03;public class Master {private  String name;public Master() {}public Master(String name) {this.name = name;}public void feed(Pet pet){//得出喂食的宠物是什么名字,是狗还是猫还是海豚if(pet instanceof Dog){System.out.println(name+"喂食的宠物是一只叫"+ ((Dog)pet).getName()+"的狗狗");}else if(pet instanceof Cat){System.out.println(name+"喂食的宠物是一只叫"+ ((Cat)pet).getName()+"的猫咪");}else if(pet instanceof Dolphin){System.out.println(name+"喂食的宠物是一只叫"+ ((Dolphin)pet).getName()+"的海豚");}//吃的方法都是被重写的,无需进行类型的判断pet.eat();}public void play(Pet pet){//每个宠物的玩耍方法都是其独有的方法,因此需要向下转型,向下转型前需要对类型进行判断if(pet instanceof Dog){System.out.print(name+"是和一只叫"+ ((Dog)pet).getName()+"的狗狗");((Dog)pet).catchDisc();}else if(pet instanceof Cat){System.out.print(name+"是和一只叫"+ ((Cat)pet).getName()+"的猫咪");((Cat)pet).catchMouse();}else if(pet instanceof Dolphin){System.out.print(name+"是和一只叫"+ ((Dolphin)pet).getName()+"的海豚");((Dolphin)pet).runningCircle();}}
}

Test类

package Work03;
public class Test {public static void main(String[] args) {Master master=new Master("张三");Dog dog=new Dog("德福");Cat cat=new Cat("叮当");Dolphin dolphin=new Dolphin("祥云");master.feed(dog);master.feed(cat);master.feed(dolphin);master.play(dog);master.play(cat);master.play(dolphin);}
}

2.3 示例代码运行截图

3 思路总结

3.1 使用多态后调用重写的方法时,无需进行对象类型的判断

理由:因为它会自动去找对应类型里面的重写了的方法去运行

3.2 使用多态后,想要调用子类特有的方法,必须实现向下转型,且向下转型前必须判断对象是哪个类型的

向下转型的理由: 使用多态后只能调用父类型特征里面从父类继承过来的属性非重写方法、以及子类重写的方法,要使用子类特有的方法就必须是子类对象才可以调用,因此需要向下转型

向下转型前必须判断对象的类型:因为只有强转的类型和实例化对象的类型保持一致,两者才可以强转,不然会出现ClassCastException类型转化异常,例如Animal a=new Dog();你只能对Animal强转成Dog类型,你强转成Cat就会报错(运行报错,编译可以通过)

解析java多态经典习题相关推荐

  1. Java程序设计经典习题15道

    Java程序设计总复习题 1.编写一个Java程序在屏幕上输出"你好!".(p13,例1-1) //programme name Helloworld.java public cl ...

  2. 详细解析Java多态、向上转型、向下转型

    1.什么是多态? 多态是同一个行为具有多个不同表现形式或形态的能力.或者说:多态就是同一个接口,通过调用不同的实例执行不同操作.  通俗的说:                          多态就 ...

  3. Java基础2019最新Java面试经典题解析

    Java基础2019最新Java面试经典题解析 1简述JVM.JRE.JDK的区别 JVM:java虚拟机 ,加载.class并运行.class JRE:java运行环境除了包含JVM以外还包含了运行 ...

  4. Java继承多态经典案例分享

    今天动力节点java培训机构小编为大家分享Java继承多态经典案例,希望通过此文能够帮助到大家,下面就随小编一起看看Java继承多态经典案例. public class A { public Stri ...

  5. 2020年Java面试经典100问,进入BAT不是梦

    本文由公众号「Java旅途」整理,设计到的内容由java基础.数据库.SSM框架.redis.消息队列.spring boot.spring cloud.git及一些前端知识.整理时间为2019-11 ...

  6. java 品尝饮料,java细节经典题型

    28. 选项中哪一行代码可以替换题目中//add code here 而不产生编译错误?() [java] view plaincopy 1. public abstract class MyClas ...

  7. Java 多态(一)

    Java 多态 多态是同一个行为具有多个不同表现形式或形态的能力. 多态性是对象多种表现形式的体现. 比如我们说"宠物"这个对象,它就有很多不同的表达或实现,比如有小猫.小狗.蜥蜴 ...

  8. java多态的实现_Java多态的实现机制是什么,写得非常好!

    作者:crane_practice www.cnblogs.com/crane-practice/p/3671074.html 2019-06-13 08:46:00 Java多态的实现机制是父类或接 ...

  9. 2022-10-24 ClickHouse 源码解析-查询引擎经典理论

    ClickHouse 源码解析: 综述 ClickHouse 源码解析: MergeTree Write-Path ClickHouse 源码解析: MergeTree Read-Path Click ...

最新文章

  1. 网络通信模型(IO模型)
  2. python基础语法有哪些-Python基础语法知识有哪些?
  3. c++中的向量容器(vector)
  4. vscode中go插件配置
  5. 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言—— 1052:计算邮资
  6. 无法查找网络工作组计算机,XP系统弹出“无法查看工作组计算机”提示怎么办?...
  7. android如何获得开发者权限,Android 动态权限获取 超级简单的方式
  8. 回调机制在 Android 监听用户界面操作中的体现
  9. 微课|中学生可以这样学Python(例9.2):无界面通信录管理系统
  10. 普中51单片机数码管实例
  11. Qt QWidget 软件开发模版
  12. 分享打造爆款书的方法,同时聊聊出版图书中的哪些事和哪些坑
  13. 鼠标计算机英语怎么说,计算机鼠标器,computer mouse,音标,读音,翻译,英文例句,英语词典...
  14. 关于pend post 与 accept
  15. 110配线架打法图解_「干货」图文并茂教会你110语音配线架线缆打法
  16. leetcode 810. Chalkboard XOR Game
  17. 一个比较全的vim指令记录
  18. “马红名师+”习作专题送教送培第二站活动安排
  19. 笨重POS机遇到便捷APP谁更有优势?
  20. 树莓派 + SSD启动 + CentOS 8 64位 + 内网穿透 + 自动温控风扇 + SMB服务 + 文件分类备份

热门文章

  1. GRID K1、K2测试的初步总结
  2. 不同Vlan之间的PC相互通信(二)
  3. js 实现登录成功 首页显示用户名和退出登录
  4. Windows 2003双机热备之二RAID配置
  5. IDEA中svn的使用(含本地代码丢失找回,收藏不亏)
  6. 《查理·芒格的智慧:投资的格栅理论》读书笔记
  7. 监督学习、无监督学习和半监督学习区别
  8. 安装 Go的三种安装方式
  9. 2021年美容师(中级)多少分及格及美容师(中级)考试技巧
  10. veryCD关闭之后,我们该何去何从。别急,找这里。