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