多态(Java)

同一事物,由于条件的不同,产生的结果不同。

多态:同一引用类型,使用不同的实例而执行不同的操作。

1.实现多态的必要条件:

        继承:有继承关系的子类和父类;

        重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。

        向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才既能可以调用父类的方法,又能调用子类的方法。

2.实现多态的主要方式:

        使用父类作为方法的形参,是java中实现和使用多态的主要方式。
        使用父类作为方法的返回值,也是java中实现和使用多态的主要方式。

3.代码实现:

1.Pet类:声明name、health、love属性,并定义了kanBing()方法等方法.

​
public class Pet {
    private String name;
    private int health;
    private int love;

    public Pet(String name, int health, int love) {
        this.name = name;
        this.health = health;
        this.love = love;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getHealth() {
        return health;
    }

    public void setHealth(int health) {
        this.health = health;
    }

    public int getLove() {
        return love;
    }

    public void setLove(int love) {
        this.love = love;
    }

    public void kanBing(){

    }
}

​

2.Dog类和Penguin类:定义了独有属性type和sex,重写了kanBing()方法。

public class Dog extends Pet{
    private String type;

    public Dog(String name, int health, int love, String type) {
        super(name, health, love);
        this.type = type;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    @Override
    public void kanBing() {
        if(this.getHealth()<60){
            this.setHealth(80);
            System.out.println(this.getType()+"打针吃药...");
            System.out.println("健康值:"+this.getHealth());
        }
    }
}
public class Penguin extends Pet{
    private String sex;

    public Penguin(String name, int health, int love, String sex) {
        super(name, health, love);
        this.sex = sex;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    @Override
    public void kanBing() {
        if (this.getHealth()<50){
            this.setHealth(90);
            System.out.println(this.getSex()+"吃药疗养...");
            System.out.println("健康值:"+this.getHealth());
        }
    }
}

3.Master类:使用父类作为方法的形参,是java中实现和使用多态的主要方式

public class Master {
    public void cure(Pet pet){
        pet.kanBing();
    }
}

4.测试类:

public class Test {
    public static void main(String[] args) {
        Pet pet;
        pet = new Dog("小小",40,70,"萨摩耶");
        Master master = new Master();
        master.cure(pet);
        System.out.println();

        pet = new Penguin("笑笑",30,90,"Q妹");
        master.cure(pet);
    }
}

运行结果:

4.向上转型和向下转型

1.向上转型:父类的引用指向子类对象(子类转父类),自动进行类型转换。

<父类型> <引用变量名> = new <子类型>();

通过父类引用变量调用的方法是子类覆盖或继承父类的方法,不是父类的方法。

通过父类引用变量无法调用子类特有的方法。

2.向下转型:将一个指向子类对象的父类引用赋给一个子类引用,(父类转换为子类)需要强制类型转换。

<子类型> <引用变量名> =(<子类型>) <父类型应用变量>;

在向下转型的时候,如果没有转换为真实的子类类型,会出现转换异常。

3.instanceof运算符:Java中为了提高向下转换的安全性,引入了instanceof。如果表达式为true,则可以安全转换。

5.实例:

(父类)Animals类:

public class Animals {
    public String type;//动物的类型
    public String food;
    public Animals() {
    }

    public Animals(String type,String food) {
        this.type = type;
        this.food = food;
    }
    public void eat(){
        System.out.println(type+"吃"+food);
    }
}

(子类)Dog类:

public class Dog extends Animals{
    public String action;
    public Dog() {
        super();
    }

    public Dog(String type, String food,String action) {
        super(type, food);
        this.action =action;
    }

    @Override
    public void eat() {
        System.out.println(type+"爱吃"+food);
    }
    public void run(){
        System.out.println(type+"爱"+action);
    }
}

(子类)Cat类:

public class Cat extends Animals{
    public String action;

    public Cat() {
        super();
    }

    public Cat(String type, String food, String action) {
        super(type, food);
        this.action = action;
    }
    @Override
    public void eat() {
        System.out.println(type+"爱吃"+food);
    }
    public void tiao(){
        System.out.println(type+"爱"+action);
    }
}

(测试类)AnimalsTest类:

public class AnimalsTest {
    public static void main(String[] args) {

        Animals animals1 = new Dog("狗","骨头","奔跑");
        Animals animals2 = new Cat("猫","鱼","跳");
        Animals animals3 = new Animals("动物","食物");

        //向上转型
        animals1.eat();
        animals2.eat();
        animals3.eat();
        System.out.println();
        //向下转型<子类型> <引用变量名> =(<子类型>) <父类型应用变量>;
        Dog dog = (Dog) animals1;
        ((Dog) animals1).run();


        Cat cat = (Cat) animals2;
        ((Cat)animals2).tiao();
        System.out.println();
        //instanceof
        /*if (animals1 instanceof DuoTaiZhuanXing.Dog) {
            DuoTaiZhuanXing.Dog dog = (DuoTaiZhuanXing.Dog) animals1;
            ((DuoTaiZhuanXing.Dog) animals1).run();
        }else{
            System.out.println("Animals无法向下转型为Dog!");
        }

        if (animals2 instanceof DuoTaiZhuanXing.Cat) {
            DuoTaiZhuanXing.Cat cat = (DuoTaiZhuanXing.Cat) animals2;
            ((DuoTaiZhuanXing.Cat)animals2).tiao();
        }else{
            System.out.println("Animals无法向下转型为Cat!");
        }*/
    }
}

运行结果:

  • 8
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值