引言:面向对象三大特征:封装,继承,多态,前面我们已经学习了封装和继承,本章节我们来详细讲解多态,该章节知识点需要使用继承知识点,如果你还未学习继承,请出门右转,学习完再回来。
一、为什么使用多态:
讲解多态之前,我们先来看一个问题,实际需求中有两种动物,狗和企鹅,现在我们需要编写一个程序实现动物饿了,动物主人喂食的过程:
经过分析,我们发现两种动物有相同的属性(昵称:name,健康值:health,亲密度:love)和相同的方法(属性对应的set/get方法及相关打印方法),那么对系统进行优化我们可以将两者相同属性和方法进一步 抽取形成共同的父类动物类,但是我们发现不同动物吃的东西不同,不同宠物吃完以后恢复的体力值不同,如果我们把动物吃东西的过程看做一个方法,那么两个类的吃东西的方法是不同的。
通过分析,我们可以得到以下类:
-
动物类:属性(共同属性),方法(共同方法)
-
狗类:属性(xx),方法(狗吃食的方法)
-
企鹅类:属性(xx),方法(企鹅吃食的方法)
-
动物主人类:属性(xx),方法(给狗狗喂食的方法,给企鹅喂食的方法)
-
编写测试类:动物主人给狗喂食的方法,动物主人给企鹅喂食的方法
代码如下:
父类:
package cn.hz;
/**
* 宠物类,狗狗和企鹅的父类。
*
* @author hz
*/
public class Pet {
private String name = "无名氏";// 昵称
private int health = 100;// 健康值
private int love = 0;// 亲密度
/**
* 有参构造方法。
* @param name 昵称
*/
public Pet(){
}
public Pet(String name) {
this.name = name;
}
public void setName(String name) {
this.name = name;
}
public void setHealth(int health) {
this.health = health;
}
public void setLove(int love) {
this.love = love;
}
public String getName() {
return name;
}
public int getHealth() {
return health;
}
public int getLove() {
return love;
}
/**
* 输出宠物信息。
*/
public void print() {
System.out.println("宠物的自白:\n我的名字叫" + this.name +
",健康值是" + this.health + ",和主人的亲密度是"
+ this.love + "。");
}
}
子类:
package cn.hz;
/**
* 狗狗类,宠物的子类。
*
* @author hz
*/
public class Dog extends Pet {
private String strain;// 品种
/**
* 有参构造方法。
* @param name 昵称
* @param strain 品种
*/
public Dog(String name, String strain) {
super(name);
this.strain = strain;
}
public String getStrain() {
return strain;
}
/**
* 重写父类的print方法。
*/
public void print(){
super.print(); //调用父类的print方法
System.out.println("我是一只 " + this.strain + "。");
}
/**
* 实现吃食方法。
*/
public void eat() {
if(getHealth()>=100){
System.out.println("狗狗"+this.getName() +"吃饱了,不需要喂食了!");
}else{
this.setHealth(this.getHealth()+3);
System.out.println("狗狗"+this.getName(