解析java多态经典习题
解析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多态经典习题相关推荐
- Java程序设计经典习题15道
Java程序设计总复习题 1.编写一个Java程序在屏幕上输出"你好!".(p13,例1-1) //programme name Helloworld.java public cl ...
- 详细解析Java多态、向上转型、向下转型
1.什么是多态? 多态是同一个行为具有多个不同表现形式或形态的能力.或者说:多态就是同一个接口,通过调用不同的实例执行不同操作. 通俗的说: 多态就 ...
- Java基础2019最新Java面试经典题解析
Java基础2019最新Java面试经典题解析 1简述JVM.JRE.JDK的区别 JVM:java虚拟机 ,加载.class并运行.class JRE:java运行环境除了包含JVM以外还包含了运行 ...
- Java继承多态经典案例分享
今天动力节点java培训机构小编为大家分享Java继承多态经典案例,希望通过此文能够帮助到大家,下面就随小编一起看看Java继承多态经典案例. public class A { public Stri ...
- 2020年Java面试经典100问,进入BAT不是梦
本文由公众号「Java旅途」整理,设计到的内容由java基础.数据库.SSM框架.redis.消息队列.spring boot.spring cloud.git及一些前端知识.整理时间为2019-11 ...
- java 品尝饮料,java细节经典题型
28. 选项中哪一行代码可以替换题目中//add code here 而不产生编译错误?() [java] view plaincopy 1. public abstract class MyClas ...
- Java 多态(一)
Java 多态 多态是同一个行为具有多个不同表现形式或形态的能力. 多态性是对象多种表现形式的体现. 比如我们说"宠物"这个对象,它就有很多不同的表达或实现,比如有小猫.小狗.蜥蜴 ...
- java多态的实现_Java多态的实现机制是什么,写得非常好!
作者:crane_practice www.cnblogs.com/crane-practice/p/3671074.html 2019-06-13 08:46:00 Java多态的实现机制是父类或接 ...
- 2022-10-24 ClickHouse 源码解析-查询引擎经典理论
ClickHouse 源码解析: 综述 ClickHouse 源码解析: MergeTree Write-Path ClickHouse 源码解析: MergeTree Read-Path Click ...
最新文章
- 网络通信模型(IO模型)
- python基础语法有哪些-Python基础语法知识有哪些?
- c++中的向量容器(vector)
- vscode中go插件配置
- 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言—— 1052:计算邮资
- 无法查找网络工作组计算机,XP系统弹出“无法查看工作组计算机”提示怎么办?...
- android如何获得开发者权限,Android 动态权限获取 超级简单的方式
- 回调机制在 Android 监听用户界面操作中的体现
- 微课|中学生可以这样学Python(例9.2):无界面通信录管理系统
- 普中51单片机数码管实例
- Qt QWidget 软件开发模版
- 分享打造爆款书的方法,同时聊聊出版图书中的哪些事和哪些坑
- 鼠标计算机英语怎么说,计算机鼠标器,computer mouse,音标,读音,翻译,英文例句,英语词典...
- 关于pend post 与 accept
- 110配线架打法图解_「干货」图文并茂教会你110语音配线架线缆打法
- leetcode 810. Chalkboard XOR Game
- 一个比较全的vim指令记录
- “马红名师+”习作专题送教送培第二站活动安排
- 笨重POS机遇到便捷APP谁更有优势?
- 树莓派 + SSD启动 + CentOS 8 64位 + 内网穿透 + 自动温控风扇 + SMB服务 + 文件分类备份