Java多态细节与instanceof关键字

时间:2020-12-08 20:48:04

多态

无继承,无多态
多态作为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();

}
}