什么是多态?
多态就是同样的方法,但参数不同。
使用多态的便捷
可以减少代码的重复
多态的使用
/*
* 主人类
*
*/
public class Master{
/*
*相同的feed方法但是参数不同
*
*/
public void feed(Dog dog){ //狗狗吃东西
dog.eat();
}
public void feed(Penguin pgn){ //企鹅吃东西
pgn.eat();
}
}
注意:
1.必须是继承
2.在子类中需要从写父类
3.父类的引用指向一个子类对象
子类到父类的转换(向上转型)
Dog dog=new new Dog("欧欧","雪瑞纳");
dog.eat();
Pet pet=new Dog(); //子类到父类的转换
Pet.pet(); //会调用Dog并重写eat()方法
注意:
1.父类引用变量和调用方法时,调用的是子类重写后的方法
2.无法通过父类调用子类的特有方法
父类作为方法形参实现多态
/*
*
*主人给宠物喂食物
*/
public void feed(Pet pet){
pet.eat();
}
public static void main(String [] args){
Master master=new Master("王先生",100);
Pet pet=new Dog("欧欧","雪纳瑞");
master.feed(Pet); //主人给宠物喂食物
}
可以看到多态:可以减少代码量,提高代码的可扩展性和可维护性
父类方法返回值实现多态
/**
* 主人领养宠物
*/
public Pet getPet(int typeId) {
Pet pet=null;
if(typeId==1) {
pet=new Dog("欧欧", "雪纳瑞");
}else if(typeId==2){
pet=new Penguin("楠楠", "Q妹");
}
return pet; //返回宠物
}
1.继承是多态的基础,没有继承就没有多态
2.子类重写父类的方法
3.父类引用变量指向子类对象
父类到子类的转换(向下转型)
Pet pet=new Dog();
Dog dog=(Dog)pet;(强制类型转换)
使用 instanceof 运算符
用于判断类型,检测对象的真是类型,返回true/false
避免类型转换异常
对象 instanceof 类/接口 pet instanceof Dog(判断宠物对象是否为Dog类型)
对象的类型和类必须具有上下级关系(继承),一般与强制类型结合使用