测试类:
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进行类型判断,然后进行相应的强制类型转换。
使用父类作为方法形参是使用多态的常用方式。