目录
1. 案例
案例1:宠物饿了,不同宠物吃的东西不一样。狗吃狗粮,企鹅吃鱼
这里我们可以用之前学的继承的方法先定义一个Pet类,再分别实现Dog类和Penguin类
public abstract class Pet {
public abstract void eat();
}
public class Dog extends Pet {
public void eat() {
System.out.println("狗粮");
}
}
public class Penguin extends Pet {
public void eat() {
System.out.println("鱼");
}
}
案例2:如果需要主人给宠物喂食,怎么办?
添加Master类,实现给XXX喂食feed(xx)的方法
public class Master {
public void feed(Dog dog){
System.out.println("喂食...");
dog.eat();
}
public void feed(Penguin penguin){
System.out.println("喂食...");
penguin.eat();
}
}
案例3: 在Master类中多次添加feed()导致代码冗余怎么办?
修改Master类,添加feed(Pet pet)方法
public class Master {
public void feed(Pet pet){
System.out.println("喂食...");
pet.eat();
}
}
案例4: 实现主人通过小卡片领养宠物
思路:Master中添加Pet getPet(int typeId)
public class Master {
public void feed(Pet pet){
System.out.println("喂食...");
pet.eat();
}
public Pet getPet(int typeId){
Pet pet = null;
if (typeId == 1){
pet = new Dog();
}else if(typeId == 2){
pet = new Penguin();
}
return pet;
}
}
案例5:实现主人与宠物玩耍功能 和狗狗玩接飞盘游戏 和企鹅玩游泳游戏
给Dog添加接飞盘方法catchingFlyDisc( )
给Penguin添加游泳方法swimming( )
给主人添加play(Pet pet)方法
public class Dog extends Pet {
public void eat() { System.out.println("狗粮"); }
public void catchingFlyDisc(){
System.out.println("接飞盘");
}
}
public class Penguin extends Pet {
public void eat(){ System.out.println("鱼"); }
public void swimming(){ System.out.println("游泳"); }
}
public class Master {
public void feed(Pet pet){
System.out.println("喂食...");
pet.eat();
}
public Pet getPet(int typeId){
Pet pet = null;
if (typeId == 1){
pet = new Dog();
}else if(typeId == 2){
pet = new Penguin();
}
return pet;
}
public void play(Pet pet){
if (pet instanceof Dog){
((Dog) pet).catchingFlyDisc();
}else if(pet instanceof Penguin){
((Penguin) pet).swimming();
}
}
}
2. 多态定义
生活中的多态定义:同一种操作,由于条件不同,产生的结果也不同,比如榨汁机投入的水果不同,榨出来的汁也不一样。
计算机中的多态定义:父类引用指向子类对象,就好比上面的案例父类作为形参
3. 多态三要素
1.编写具有继承关系的父类和子类
public class Dog extends Pet
2.子类重写父类方法
public abstract class Pet {
public abstract void eat();
}
public class Dog extends Pet{
public void eat(){
System.out.println("狗粮");
}
}
3.使用父类的引用指向子类的对象
public Pet getPet(int typeId){
Pet pet = null;
if (typeId == 1){
pet = new Dog();
}else if(typeId == 2){
pet = new Penguin();
}
return pet;
}
4. 多态表现形式
1.将父类作为方法形参
public void feed(Pet pet){
System.out.println("喂食...");
pet.eat();
}
2.将父类作为方法返回值
public Pet getPet(int typeId){
Pet pet = null;
if (typeId == 1){
pet = new Dog();
}else if(typeId == 2){
pet = new Penguin();
}
return pet;
}
5. 多态中的向上转型
- 定义:子类转换成父类,即用父类的引用变量引用了子类对象
- 特点:自动转换
- 代码体现:
public Pet getPet(int typeId){
Pet pet = null;
if (typeId == 1){
pet = new Dog(); //子类Dog转换成父类Pet
}else if(typeId == 2){
pet = new Penguin();
}
return pet;
}
6. 多态中的向下转型
- 定义:父类转换成子类,因为引用的是父类类型,所以只能使用父类中定义的方法属性,要使用子类中的方法属性就需要强制转换
- 特点:强制转换
- 代码体现:
public void play(Pet pet){
if (pet instanceof Dog){
((Dog) pet).catchingFlyDisc();//强制转换
}else if(pet instanceof Penguin){
((Penguin) pet).swimming();
}
}
7. instanceof运算符
这个运算符在上面的案例中已经出现过了,相信聪明的小伙伴已经猜到它的作用了
定义:Pet instanceof Dog 判断Pet类型是否属于Dog类型