关于java多态的的理解主要用两句话:
- 子承父业 指 ----->继承父亲的称呼,手艺,特征
- 打着父亲的名称干自己的事 指 -----> 伪装成父亲干活
接下来说明: 封装 继承 多态
代码理解:
父类Pet
public abstract class Pet {
private String name = "无名氏";// 昵称
private int health = 100;// 健康值
private int love = 0;// 亲密度
/**
* 抽象方法eat(),负责宠物吃饭功能。
*/
public abstract void eat();
/**
* 有参构造方法。
* @param name 昵称
*/
public Pet(){
}
public Pet(String name) {
this.name = name;
}
public void setName(String name) {
this.name = name;
}
public void setHealth(int health) {
if(health>0&&health<100 ){
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 + "。");
}
}
子类猫
public class Cat extends Pet{
private String CatStrain;// 品种
public Cat(String name, String CatStrain) {
super(name);
this.CatStrain = CatStrain;
}
@Override
public void eat() {
if(getHealth()>=100){
System.out.println("猫猫"+this.getName() +"吃饱了,不需要喂食了!");
}else{
this.setHealth(this.getHealth()+4);
System.out.println("猫猫"+this.getName() + "吃饱啦!健康值增加3。");
}
}
}
子类狗
/**
* 狗狗类,宠物的子类。
*/
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() + "吃饱啦!健康值增加3。");
}
}
public void catchingFlyDisc() {
System.out.println("主人和狗狗"+this.getName()+"玩接飞盘游戏,狗狗健康值减少10,与主人亲密度增加5");
}
}
企鹅类
/**
* 企鹅类,宠物的子类。
*/
public class Penguin extends Pet {
private String sex;// 性别
/**
* 有参构造方法。
* @param name 昵称
* @param sex 性别
*/
public Penguin(String name, String sex) {
super(name);
this.sex = sex;
}
public String getSex() {
return sex;
}
/**
* 重写父类的print方法。
*/
public void print() {
super.print();
System.out.println("性别是 " + this.sex + "。");
}
/**
* 实现吃食方法。
*/
public void eat() {
if(getHealth()>=100){
System.out.println("企鹅"+this.getName() +"吃饱了,不需要喂食了!");
}else{
this.setHealth(this.getHealth()+5);
System.out.println("企鹅"+this.getName() + "吃饱啦!健康值增加3。");
}
}
public void swimming() {
System.out.println("主任和企鹅"+this.getName()+"玩游泳,企鹅健康值减少10,与主人亲密度增加5");
}
}
主人类
**
* 主人类。
*/
public class Master {
private String name = "";// 主人名字
private int money = 0; // 元宝数
/**
* 有参构造方法。
* @param name 主人名字
* @param money 元宝数
*/
public Master(String name, int money) {
this.name = name;
this.money = money;
}
public void setName(String name) {
this.name = name;
}
public void setMoney(int money) {
this.money = money;
}
public int getMoney() {
return money;
}
public String getName() {
return name;
}
/**
* 主人给D喂食。
*/
// 此时主人开始喂食 maser.feed() 传过来Dog的类型
// 因为Pet 是父类所以自动的对象类型转换为Pet
//此时传过来的Gog所然已经转变成Pet类型但是依然是狗的本质不变只是多了一个称呼。路径不变
//当pet.eat()时pet会去调用父类的eat();
//因为子类Dog继承了Pet切重写了eat()方法,所以此时会调用Dog类的eat()方法
public void feed(Pet pet) {
pet.eat();
}
//领养宠物
public Pet getPet(String type){
//new 不同的宠物
Pet p1=null;
if (type.equals("1")) {
p1=new Dog("旺旺","串串");
}
if (type.equals("2")) {
p1=new Penguin("黑白","Q仔");
}
return p1;
}
//
public void play(Pet pet){
if (pet instanceof Dog){
Dog dog=(Dog) pet;
dog.catchingFlyDisc();
}else if (pet instanceof Penguin){
Penguin pgn=(Penguin) pet;
pgn.swimming();
}
开始实现测试结果
/**
* 测试类,领养宠物并喂食。
*/
public class Test {
public static void main(String[] args) {
//狗企鹅此时为子类 要通过多态的方式来喂养
//Pet 为父类 里面有一个抽象的feed方法
Dog dog = new Dog("欧欧", "雪娜瑞");
dog.setHealth(80); //设置健康值,以便正常喂食
Penguin pgn = new Penguin("楠楠", "Q妹");
Master master=new Master("王先生",100); //
master.feed(dog); //主人给狗狗喂食
master.feed(pgn); //主人给企鹅喂食
pgn.setHealth(80); //设置健康值,以便正常喂食
master.feed(pgn); //主人再次给企鹅喂食
/*Master master=new Master("王先生",100);
Pet p= master.getPet("1");
p.eat();
//做玩游戏的测试
Dog dog = new Dog("欧欧", "雪娜瑞");
master.play(dog);*/
}
}