测试类:
package cn.jbit.epettest; import cn.jbit.epetshop.Dog; import cn.jbit.epetshop.Master; import cn.jbit.epetshop.Penguin; /** * 测试类 * * @author kyaccp * */ public class EpetTest { /** * 程序入口 * * @param args * 输入的参数 */ public static void main(String[] args) { // 创建一个狗狗对象 Dog dog = new Dog("欧欧", 100, 0, "娜娜雪瑞"); // 创建一个企鹅对象 Penguin penguin = new Penguin("楠楠", 100, 0, "Q仔"); // 创建一个主人对象 Master master = new Master(); master.feed(dog); // 调用喂食方法 master.play(dog); // 调用玩耍方法 master.feed(dog); // 调用喂食方法 System.out.println(); master.feed(penguin); // 调用喂食方法 master.play(penguin); // 调用玩耍方法 master.feed(penguin); // 调用喂食方法 } }
实体类:
package cn.jbit.epetshop; /** * 宠物类 * * @author chaoyi * @2013-10-17 上午09:25:09 */ public abstract class Pet { /** * 无参构造函数 */ public Pet() { } /** * 带参构造函数 * * @param name * 昵称 * @param health * 健康值 * @param love * 亲密度 */ public Pet(String name, int health, int love) { this.setName(name); this.setHealth(health); this.setLove(love); } private String name; // 昵称 /** * 读取昵称 * * @return 昵称 */ public String getName() { return name; } /** * 指定昵称 * * @param name * 昵称 */ public void setName(String name) { this.name = name; } private int health = 100; // 健康值 /** * 读取健康值 * * @return 健康值 */ public int getHealth() { return health; } /** * 指定健康值 * * @param health * 健康值 */ public void setHealth(int health) { if (health >= 0 && health <= 100) { this.health = health; } else { health = 40; System.out.println("健康值应该在0~100之间,默认值是40"); } } private int love = 0; // 亲密度 /** * 读取亲密度 * * @return 亲密度 */ public int getLove() { return love; } /** * 指定亲密度 * * @param love * 亲密度 */ public void setLove(int love) { this.love = love; } /** * 输出信息 */ public abstract void print(); /** * 实现吃的方法 */ public abstract void eat(); }
package cn.jbit.epetshop; /** * 主人类 * * @author kyaccp * */ public class Master { /** * 主人给宠物喂食方法 * * @param pet * 宠物对象 */ public void feed(Pet pet) { pet.eat(); // 调用吃的方法 } /** * 宠物玩耍方法 * * @param pet * 宠物对象 */ public void play(Pet pet) { if (pet instanceof Dog) { // 如果传入的是狗狗 Dog dog = (Dog) pet; dog.catchingFly(); // 调用狗狗玩飞盘游戏方法 } else if (pet instanceof Penguin) { // 如果传入的是企鹅 Penguin penguin = (Penguin) pet; penguin.swimming(); // 调用企鹅游泳方法 } } }
package cn.jbit.epetshop; /** * 宠物狗狗类 * * @author Administrator * */ public class Dog extends Pet { private String strain; // 品种 /** * 读取品种 * * @return 品种 */ public String getStrain() { return strain; } /** * 指定品种 * * @param love * 品种 */ public void setStrain(String strain) { this.strain = strain; } /** * 无参构造函数 */ public Dog() { } /** * 带参构造函数 * * @param name * 昵称 * @param health * 健康值 * @param love * 亲密度 * @param strain * 品种 */ public Dog(String name, int health, int love, String strain) { super(name, health, love); this.setStrain(strain); } /** * 输出狗狗信息 */ public void print() { System.out.println("宠物 的自白:\n我的名字叫" + super.getName() + ",健康值是" + super.getHealth() + ",和主人的亲密度是" + super.getLove() + ",我是一只" + this.strain + "。"); } /** * 实现狗狗吃饭的方法 */ public void eat() { int health; // 健康值 if (super.getHealth() <= 95) { health = super.getHealth() + 5; if (health > 100) // 表示健康值大于100 health = 100; super.setHealth(health);// 设置健康值 System.out.println("狗狗" + super.getName() + "吃饱啦!健康值增加5。"); } else { System.out.println("狗狗" + super.getName() + "已经吃饱啦!不需要再喂食了。"); } } /** * 狗狗玩飞盘游戏 */ public void catchingFly() { super.setHealth(getHealth() - 10); // 健康值减少10 if (getHealth() < 0) setHealth(0); super.setLove(getLove() + 5); // 亲密度增加5 System.out.println("狗狗" + super.getName() + "正在接飞盘。"); } }
package cn.jbit.epetshop; /** * 宠物企鹅类 * * @author Administrator * */ public class Penguin extends Pet { public final static String SEX_MALE = "Q仔"; // 性别 public final static String SEX_FEMALE = "Q妹"; // 性别 private String sex = SEX_FEMALE; // 性别 /** * 读取性别 * * @return 性别 */ public String getSex() { return sex; } /** * 指定性别 * * @param love * 性别 */ public void setSex(String sex) { this.sex = sex; } /** * 无参构造方法 */ public Penguin() { } /** * 带参构造方法 * * @param name * 昵称 * @param health * 健康值 * @param love * 亲密度 * @param sex * 性别 */ public Penguin(String name, int health, int love, String sex) { super(name, health, love); this.setSex(sex); } /** * 输出企鹅信息 */ public void print() { System.out.println("宠物 的自白:\n我的名字叫" + super.getName() + ",健康值是" + super.getHealth() + ",和主人的亲密度是" + super.getLove() + ",性别是" + this.sex + "。"); } /** * 实现企鹅吃饭的方法 */ public void eat() { int health; // 健康值 if (super.getHealth() <= 95) { health = super.getHealth() + 5; if (health > 100) // 表示健康值大于100 health = 100; super.setHealth(health); // 设置健康值 System.out.println("企鹅" + super.getName() + "吃饱啦!健康值增加5。"); } else { System.out.println("企鹅" + super.getName() + "已经吃饱啦!不需要再喂食了。"); } } /** * 企鹅游泳方法 */ public void swimming() { super.setHealth(getHealth() - 10); // 健康值减少10 super.setLove(getLove() + 5); // 亲密度增加5 System.out.println("企鹅" + super.getName() + "正在游泳。"); } }
多态(Polymorphism)是具有表现多种形态的能力的特征。更专业化的说法是:同一个实 现接口,使用不同的实例而执行不同的操作。
instanceof运算符
对象 instanceof 类或接口
该运算符用来判断一个对象是否属于一个类或者实现了一个接口 ,结果为true或false。在强制类型转换之前通过instanceof运算符检查对象的真实类型,然后再进行相应的强制类型转换,这 样就可以避免类型转换异常,从而提高代码健壮性。
通过多态可以减少类中代码量,可以提高代码的可扩展性和可维护性。继承是多态的基础,没有继承就没有多态。
把子类转换为父类,称为向上转型,自动进行类型转换。把父类转换为子类,称为向下转型,必须进行强制类型转换。
向上转型后可以访问子类特有的方法。必须转换为父类指向的真实子类类型,否则将出现类型转换异常ClassCastException 。
instanceof运算符用于判断一个对象是否属于一个类或实现了一个接口。
instanceof运算符通常和强制类型转换结合使用,首先通过instanceof进行类型判断,然后进行相应的强制类型转换。
使用父类作为方法形参是使用多态的常用方式。
个人E-mail:chaoyi77@163.com
相关推荐
1.继承的本质和原理 ...3.重载、覆盖、隐藏 4.静态绑定和动态绑定 5.多态 vfptr和vftbale 6.抽象类的设计原理 7.多继承以及问题 8.虚基类 vbptr和vbtable 9.RTTI 10.C++四种类型强转 11.继承多态常见笔试面试题分享
3. 如果要定义运行时异常(Unchecked Exception),即那些在运行时才抛出的异常,需要扩展`RuntimeException`类。 了解并熟练掌握这些知识点对于Java开发者来说至关重要,它们是编写高效、可维护的代码的基础。在...
3. 多态的动态绑定特性,也称为晚期绑定或运行时绑定。这意味着在编译期间无法确定具体调用哪个方法,而是在运行时根据对象的实际类型决定。 4. 多态提高了代码的复用性和可扩展性。通过定义通用的接口或基类,可以...
3.删除离职职工 4.修改职工信息 5.查找职工信息 6.按编号排序 7.清空所有文件记录信息 可改写为其他系统,如学生管理、成绩管理等。 可从中学习到的内容为: 1.多态的使用 2.抽象类的使用 3.文件读写 4.二重指针数组...
3. 多态调用:在主程序中,我们可以创建基类的引用,但将其实例化为子类对象。这样,即使引用是基类类型,也可以调用子类重写后的方法,这就是多态性。 ```csharp BaseClass obj = new DerivedClass(); obj.Method()...
3. **配置多态VI**:在多态VI中,可以决定是否默认显示选择框,以及是否允许根据输入数据类型自动选择实例VI。用户也可以通过右键菜单或选择栏手动选择实例VI。 4. **设计考虑**:多态VI的设计应遵循一致性原则,...
3. 实现多态的条件: - 继承:至少有一个父类和一个或多个子类。 - 方法重写:子类必须重写父类中的某个方法。 - 父类引用指向子类对象:父类类型的引用变量可以引用子类的对象,这样就可以通过父类引用调用子类...
3. 多态访问成员的特点: - 3.1 成员变量:多态情况下,访问的成员变量总是父类的变量,而不是子类的,因为成员变量不存在覆盖的概念。 - 3.2 成员方法:如果子类重写了父类的方法,多态调用时将执行子类的方法,...
3. C++模板元编程中的多态:这是一种在编译时进行计算的技术,通过模板可以实现类似于泛型编程的静态多态,提供非常高效且类型安全的代码。 4. 动态语言中的多态:例如Python和JavaScript等语言,它们的动态类型...
1面向对象编程的基本思想;2友元类成员;3虚函数;4类类型之间的强制转换;5嵌套类 1.封装: 把对象的属性和方法结合成一个...3.多态:指在基类中定义的属性和行为被子类继承后,可以具有不同的数据类型或者表现行为等特性
3. 多态(Polymorphism) 多态允许相同的操作在不同的对象上有不同的行为,这在C++中主要通过虚函数实现。在`Shape`类中,`calculateArea`被声明为虚函数(`virtual`),这意味着任何继承`Shape`的子类都可以重写这...
#### 3. 多态的应用 **多态**是指程序中能够使用一个接口表示多种不同实体的能力。它是通过函数重载、运算符重载以及虚函数等方式实现的。多态的主要目的是提高代码的灵活性和可扩展性。 在继承的基础上,多态...
3. 虚析构函数:为了确保删除基类指针指向的对象时,能够正确调用到子类的析构函数,需要在基类中声明虚析构函数。即使基类没有成员变量,也应声明为虚的,以支持多态性: ```cpp class Base { public: virtual ~...
3. 多态:多态是指同一种行为可以有不同的表现形式,这在Java中主要体现在方法的覆盖(override)和接口的实现上。子类可以重写父类的方法,从而在运行时根据实际的对象类型执行不同的代码。实验可能会要求设计具有...
3. 多态是面向对象编程语言的独特特性,使得软件编程时的实现无关性,程序针对接口和抽象类编程,而不需要关心具体实现是什么。 4. 多态还颠覆了程序模块间的依赖关系,使得程序呈现多态的特性。 5. 设计模式的精髓...
3. 多态:通过使用父类引用指向子类对象,实现`display`方法的运行时多态,允许根据实际对象类型执行不同的行为。 理解并熟练运用封装、继承和多态,能够帮助开发者编写出结构清晰、可扩展性强的代码,提升软件的...
1. 封装 2. 继承 3. 多态 4. 抽象
3. 多态的概念和机制 4. 使用super关键字来调用超类的构造函数和方法 5. 继承和多态在编程中的应用 本资源是关于JavaSE程序设计的课件,主题是面向对象编程。我们学习了继承和多态的概念和机制,并学习了如何使用...
3. 多态访问成员规则: - 成员变量:无论编译还是运行时,都根据父类类型来访问。 - 非静态成员方法:编译时看父类,运行时看子类(动态绑定)。 - 静态成员:编译和运行时都看父类。 4. 多态的应用场景: - ...
3. 多态:同一个方法可以有多种不同的实现。 4. 封装:对成员变量和成员方法的访问权限进行控制。 在 Java 中,面向对象编程的实现可以通过以下几种方式: 1. 类的设计:设计类的结构和成员变量。 2. 对象的创建:...