Java学习(超详细)八(多态)

目录

1. 案例

2. 多态定义

3. 多态三要素

4. 多态表现形式

5. 多态中的向上转型

6. 多态中的向下转型

7. instanceof运算符


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. 多态中的向上转型

  1. 定义:子类转换成父类,即用父类的引用变量引用了子类对象
  2. 特点:自动转换
  3. 代码体现:
    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. 多态中的向下转型

  1. 定义:父类转换成子类,因为引用的是父类类型,所以只能使用父类中定义的方法属性,要使用子类中的方法属性就需要强制转换
  2. 特点:强制转换
  3. 代码体现:
    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类型

猜你喜欢

转载自blog.csdn.net/jojo_oulaoula/article/details/131214715
今日推荐