再继承的基础上,更加便捷的使用,就需要多态
在Java中,多态可以通过继承和接口实现
- 编译时:通过继承和方法重写,子类对象可以被当作父类对象使用:对象 instanceof 子类
- 运行时:通过方法的动态绑定,根据对象的实际类型确定调用哪个方法
1.抽象父类代码:抽象abstract只会固定格式不会有方法体,需要子类重写
package began;
//抽象父类
public abstract class Pet{
String name;//名字
int power;//能量值
public abstract void eat(int num);//抽象方法没有方法体,必须由子类来继承重写
}
2.子类1:子类需要重写父类所有的方法
package began;
//子类需要去重写父类的所有方法
public class PetDog extends Pet {
public PetDog(String name,int power){
this.name=name;
this.power=power;
}
//狗的共同方法,比如看家
public void lookdoor(){
System.out.println("I am looking door");
}
//重写
@Override//注解
public void eat(int num) {
this.power+=num;
System.out.println("小狗"+this.name+"能量值增加了"+num+"最终为"+this.power+"能量值");
}
}
3.子类2
package began;
public class PetCat extends Pet {
public PetCat(String name,int power){
this.name=name;
this.power=power;
}
//猫的共同方法,比如抓老鼠
public void catchMouse(){
System.out.println("I am catching mouse");
}
//重写
@Override//注解
public void eat(int num) {
this.power+=num;
System.out.println("小猫"+this.name+"能量值增加了"+num+"最终为"+this.power+"能量值");
}
}
4.驱动子类综合调动
package began;
public class Petmaster {
public static void feed(Pet pet, int num) { //Pet pet,pet在具体输入的是dog还是cat自动识别
pet.eat(num);
}
//master类中work的方法去驱动动物工作
public void work(Pet pet){
//区分动物类型 对象 instanceof 类型
if(pet instanceof PetDog){
PetDog dog=(PetDog)pet;//向下转型,从父类-->子类,强制父类Pet转型为子类PetDog
dog.lookdoor();
}else if(pet instanceof PetCat){
PetCat cat=(PetCat)pet;
cat.catchMouse();;
}
}
}
5.主函数
package began;
public class TPET {
public static void main(String[] args) {
//综合调度其他类
PetDog dog = new PetDog("周梦",100);
PetCat cat = new PetCat("姚旺",120);
Petmaster master =new Petmaster();
Petmaster.feed(dog,30);
master.feed(cat,50);
master.work(dog);
master.work(cat);
}
}