`
chaoyi
  • 浏览: 309915 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

3.多态

 
阅读更多

测试类:

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

  • 大小: 55.1 KB
  • 大小: 49.7 KB
分享到:
评论

相关推荐

    1.继承的本质和原理 2.派生类的构造类型 3.重载、覆盖、隐藏 4.静态绑定和动态绑定 5.多态 vfptr和vftbale

    1.继承的本质和原理 ...3.重载、覆盖、隐藏 4.静态绑定和动态绑定 5.多态 vfptr和vftbale 6.抽象类的设计原理 7.多继承以及问题 8.虚基类 vbptr和vbtable 9.RTTI 10.C++四种类型强转 11.继承多态常见笔试面试题分享

    【独家高薪笔面试题库】与【实战配套练习演练】10.多态继承与超级关键字1

    3. 如果要定义运行时异常(Unchecked Exception),即那些在运行时才抛出的异常,需要扩展`RuntimeException`类。 了解并熟练掌握这些知识点对于Java开发者来说至关重要,它们是编写高效、可维护的代码的基础。在...

    java多态的实现

    3. 多态的动态绑定特性,也称为晚期绑定或运行时绑定。这意味着在编译期间无法确定具体调用哪个方法,而是在运行时根据对象的实际类型决定。 4. 多态提高了代码的复用性和可扩展性。通过定义通用的接口或基类,可以...

    基于多态的职工管理系统

    3.删除离职职工 4.修改职工信息 5.查找职工信息 6.按编号排序 7.清空所有文件记录信息 可改写为其他系统,如学生管理、成绩管理等。 可从中学习到的内容为: 1.多态的使用 2.抽象类的使用 3.文件读写 4.二重指针数组...

    VS2010 C# 多态实例

    3. 多态调用:在主程序中,我们可以创建基类的引用,但将其实例化为子类对象。这样,即使引用是基类类型,也可以调用子类重写后的方法,这就是多态性。 ```csharp BaseClass obj = new DerivedClass(); obj.Method()...

    28.多态VI.doc-综合文档

    3. **配置多态VI**:在多态VI中,可以决定是否默认显示选择框,以及是否允许根据输入数据类型自动选择实例VI。用户也可以通过右键菜单或选择栏手动选择实例VI。 4. **设计考虑**:多态VI的设计应遵循一致性原则,...

    java多态实验

    3. 实现多态的条件: - 继承:至少有一个父类和一个或多个子类。 - 方法重写:子类必须重写父类中的某个方法。 - 父类引用指向子类对象:父类类型的引用变量可以引用子类的对象,这样就可以通过父类引用调用子类...

    Java相关知识的学习(关键字)(多态)

    3. 多态访问成员的特点: - 3.1 成员变量:多态情况下,访问的成员变量总是父类的变量,而不是子类的,因为成员变量不存在覆盖的概念。 - 3.2 成员方法:如果子类重写了父类的方法,多态调用时将执行子类的方法,...

    原来多态还可以这样

    3. C++模板元编程中的多态:这是一种在编译时进行计算的技术,通过模板可以实现类似于泛型编程的静态多态,提供非常高效且类型安全的代码。 4. 动态语言中的多态:例如Python和JavaScript等语言,它们的动态类型...

    类继承与虚函数.ppt

    1面向对象编程的基本思想;2友元类成员;3虚函数;4类类型之间的强制转换;5嵌套类 1.封装: 把对象的属性和方法结合成一个...3.多态:指在基类中定义的属性和行为被子类继承后,可以具有不同的数据类型或者表现行为等特性

    C++基础入门:面相对象编程C++中的封装、继承和多态.docx

    3. 多态(Polymorphism) 多态允许相同的操作在不同的对象上有不同的行为,这在C++中主要通过虚函数实现。在`Shape`类中,`calculateArea`被声明为虚函数(`virtual`),这意味着任何继承`Shape`的子类都可以重写这...

    浅谈c++的精髓之继承和多态

    #### 3. 多态的应用 **多态**是指程序中能够使用一个接口表示多种不同实体的能力。它是通过函数重载、运算符重载以及虚函数等方式实现的。多态的主要目的是提高代码的灵活性和可扩展性。 在继承的基础上,多态...

    CPP.rar_多态 .cpp

    3. 虚析构函数:为了确保删除基类指针指向的对象时,能够正确调用到子类的析构函数,需要在基类中声明虚析构函数。即使基类没有成员变量,也应声明为虚的,以支持多态性: ```cpp class Base { public: virtual ~...

    WHUT-java多线程实验-第一周-继承、多态.zip

    3. 多态:多态是指同一种行为可以有不同的表现形式,这在Java中主要体现在方法的覆盖(override)和接口的实现上。子类可以重写父类的方法,从而在运行时根据实际的对象类型执行不同的代码。实验可能会要求设计具有...

    16丨设计模式基础:不会灵活应用设计模式,你就没有掌握面向对象编程.pdf

    3. 多态是面向对象编程语言的独特特性,使得软件编程时的实现无关性,程序针对接口和抽象类编程,而不需要关心具体实现是什么。 4. 多态还颠覆了程序模块间的依赖关系,使得程序呈现多态的特性。 5. 设计模式的精髓...

    一个实例告诉你什么是封装继承和多态

    3. 多态:通过使用父类引用指向子类对象,实现`display`方法的运行时多态,允许根据实际对象类型执行不同的行为。 理解并熟练运用封装、继承和多态,能够帮助开发者编写出结构清晰、可扩展性强的代码,提升软件的...

    图灵学院面试制胜宝典电子版1

    1. 封装 2. 继承 3. 多态 4. 抽象

    JavaSE程序设计课件:L02-Object-oriented programming - 3.pdf

    3. 多态的概念和机制 4. 使用super关键字来调用超类的构造函数和方法 5. 继承和多态在编程中的应用 本资源是关于JavaSE程序设计的课件,主题是面向对象编程。我们学习了继承和多态的概念和机制,并学习了如何使用...

    第一阶段javaEE.doc

    3. 多态访问成员规则: - 成员变量:无论编译还是运行时,都根据父类类型来访问。 - 非静态成员方法:编译时看父类,运行时看子类(动态绑定)。 - 静态成员:编译和运行时都看父类。 4. 多态的应用场景: - ...

    Java第三章习题

    3. 多态:同一个方法可以有多种不同的实现。 4. 封装:对成员变量和成员方法的访问权限进行控制。 在 Java 中,面向对象编程的实现可以通过以下几种方式: 1. 类的设计:设计类的结构和成员变量。 2. 对象的创建:...

Global site tag (gtag.js) - Google Analytics