Java多态细节与instanceof关键字

多态

无继承,无多态
多态作为OOP三大特性之一,在现实生活中,表现为一个对象可以有多种形态
OOP语言中也就是一个对象对应着不同类型,代码的直接体现在于父类或者接口的引用指向其子类的对象

  • 好处
    提高了代码的扩展性,前期定义的代码可以使用后期的内容

比如下面添加其他具体动物类,都可以实现eat()方法,父类引用型变量绑定通过不同的对象调用同名的不同方法

  • 弊端
    前期定义的内容不能使用后期子类的特有内容

比如每个具体的func特有功能方法,那么Animal类型变量就无法访问,必须向下转换为子类对象

  • 对象类型的隐式转换和显示转换

首先,对于对象转型,都是子类对象向上转换或父类父类对象向下转换(实际上基本数据类型的类型转换也可以看成对象类型转换,比如Integer其实就是int的类型)
向上转换:是为了实现功能的扩展性
向下转换:是为了使用子类的特有功能
没有继承关系的类之间的转换会报错

instanceof 关键字

instenceof 用于判断对象的具体类型,只能用于引用数据类型的判断,确保源对象是否为目标对象的实例

一般用于健壮性的判断:要使用子类特有功能须向下转型,一般要先判断对象类型

  • 多态使用的前提
    1.必须有关系:继承、实现
    2.要有覆盖

关于多态成员的特点请看另一篇:多态成员的特点

abstract class  Animal //也可以换成接口
{
    abstract void eat();
} 
class  Cat extends Animal
{
     void eat()
    {
        System.out.println("猫爱吃鱼");
    }
     void catFunc()
    {
        System.out.println("猫抓老鼠");
    }
}

class Dog extends Animal
{
    void eat()
    {
        System.out.println("狗爱吃骨头");
    }
    void dogFunc()
    {
        System.out.println("狗看门");
    }
}
class Cattle extends Animal
{
    void eat()
    {
        System.out.println("牛爱吃草");
    }
    void cattleFunc()
    {
        System.out.println("牛耕田");
    }
}

class  Polymorphism
{
    public static void main(String[] args) 
    {
        Animal a = new Cat();//自动类型提升,cat对象提升为了Animal(向上转型),但是特有功能无法访问
        eatMethod(a);
        ((Cat)a).catFunc();//若要使用子类中的特有功能,必须向下转换注意括号不可少,先转换,再.操作
    //对于转型,都是子类对象向上转换或父类父类对象向下转换
    }
    public static void eatMethod(Animal a )
    {
        a.eat();
        if( a instanceof Cat)//instenceof 用于判断对象的具体类型,只能用于引用数据类型的判断,确保源对象是否为目标对象的实例
            ((Cat)a).catFunc();
        if( a instanceof Dog)
            ((Dog)a).dogFunc();
        if( a instanceof Cattle)
            ((Cattle)a).cattleFunc();

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值