Java基础14-多态(思想、转型、instanceof)

一、什么是多态?

1.多态的定义

多态,字面意思就是多种状态,他表示一种事物的多种状态。

class Animal{
    public void eat() {
        System.out.println("吃一般的食物");
    }
}
//狗和猫类继承动物类并重写eat方法
class Dog extends Animal{
    public void eat() {
        System.out.println("吃骨头");
    }
}
class Cat extends Animal{
    public void eat() {
        System.out.println("吃鱼");
    }
}
public class duotai {
    public static void main(String[] args) {
        //当代码变为一下样子多态就产生了
        Animal a=new Dog();
        a.eat();
        a=new Cat();
        a.eat();
        }
}

上边对象a具有两种类型
编译类型:声明对象变量的类型,Animal表示把对象看出什么类型
运行类型:对象的真实类型,Dog运行类型 对象的真实类型
编译类型必须是运行类型的父类或相同
当编译类型和运行类型不同的时候,多态就出现了

所谓多态:对象具有多种形态,对象可以存在不同的形式。

其实就是,我们创建了一个动物对象,这个动物对象即可以是猫,也可以是狗,是猫的时候吃鱼,是狗的时候吃骨头。
Animal a=new Dog() //此时a表示Dog类型的形态
a=new Cat() //此时a表示Cat类型的形态

2.多态的前提和特点

多态的前提:必须有继承关系(错误的说法)
可以是继承关系,也可以是实现关系(接口和实现类)。正确
多态的特点:
把子类对象赋给父类变量,在运行时期会表现出具体的子类特征

 2.多态的好处

假设我们目前有这样的需求,给饲养员提供一个喂养动物的方法,用于喂养动物

没有多态, 针对不同类型的动物,我们要提供不同的feed方法来喂食,非常繁琐,不够简洁。

那怎样才能只提供一个方法就可以统一喂养所有动物?

这就是多态的好处

把不同的子类对象当做父类类型来看待,可以屏蔽不同子类对象之间的实现差异,从而写出通用的代码的代码达到通用编程,以适应需求的不同变化、

提高了代码的扩展性

 二、多态的转型

1.向上转型

l当有子类对象赋值给一个父类引用时,便是向上转型,多态本身就是向上转型的过程。

2.向下转型

 一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用转为子类引用,这个过程是向下转型。如果是直接创建父类对象,是无法向下转型的!

运行报错,因为我们无法将猫转换成狗

那什么时候使用向上转型呢?

当不需要面对子类类型时,通过提高扩展性,或者使用父类的功能就能完成相应的操作,这时就可以使用向上转型。

如:Animal a = new Dog();

    a.eat();

l什么时候使用向下转型?

当要使用子类特有功能时,就需要使用向下转型。

如:Dog d = (Dog) a; //向下转型

    d.lookHome();//调用狗类的lookHome方法

l向下转型的好处:可以使用子类特有功能。

弊端是:需要面对具体的子类对象;在向下转型时容易发生ClassCastException类型转换异常。

那怎么解决这个弊端呢?

3.instanceof关键字

当发生以上这种情况时,我们就需要用到instance of这个关键字

instanceof 判断对象是否是某一个类的实例
* 语法格式: boolean b= 对象A instance of 类B
* 判断A对象是否是B对象的实例

 

猜你喜欢

转载自www.cnblogs.com/LuckyGJX/p/8973350.html