多态

1.多态概述

多态性是面向对象思想中的一个非常重要的概念,在Java中,多态是指不同对象在调用同一个方法时表现出的多种不同行为。例如,要实现一个动物叫的方法,由于每种动物的叫声是不同的,因此可以在方法中接收一个动物类型的参数,当传入猫类对象时就发出猫类的叫声,传入犬类对象时就发出犬类的叫声。在同一个方法中,这种由于参数类型不同而导致执行效果不同的现象就是多态。Java中多态主要有以下两种形式。

1.方法的重载。

2.对象的多态性(方法重写)。

下面通过一个案例演示Java程序中的多态,如图1所示。

图1:

图1运行结果: 

在图1中,第2~4行代码定义了一个抽象类Animal,在抽象类Animal中定义了抽象方法shout()。第6~18行代码定义了两个继承Animal的类Cat和Dog,并在Cat类和Dog类中重写了Animal类中的shout()方法。第22~25行代码创建了Cat类对象和Dog类对象,然后通过Animal类型的对象an1和an2调用shout()方法。从图1运行结果可以看出,对象an1和an2调用的分别是Cat类和Dog类中的shout()方法。

2.对象类型的转换

对象类型转换主要分为以下两种情况。

1.向上转型:子类对象→父类对象

2.向下转型:父类对象→子类对象

对于向上转型,程序会自动完成,而向下转型时,必须指明要转型的子类类型。对象类型的转换格式如下所示。

对象向上转型:

父类类型 父类对象 = 子类实例;

对象向下转型:

父类类型 父类对象 = 子类实例;

子类类型 子类对象 = (子类)父类对象;

下面通过一个案例介绍如何进行对象的向上转型操作,如图2所示。

图2:

图2运行结果:

 在图2中的程序就是一个对象向上转型的实例。第20~22行代码是创建了一个dog对象,并将dog对象向上转型成Animal类型的对象an,然后使用对象an调用shout()方法。从图2运行结果可以发现,虽然是使用父类对象an调用了shout()方法,但实际上调用的是被子类重写过的shout()方法。也就是说,如果对象发生了向上转型关系后,所调用的方法一定是被子类重写过的方法。

需要注意的是,父类Animal的对象an是无法调用Dog类中的eat()方法的,因为eat()方法只在子类中定义,没有在父类中定义。

在进行对象的向下转型前,必须发生对象向上转型,否则将出现对象转换异常。下面通过一个案例演示对象进行向下转型,如图3所示。

图3:

图3运行结果:

 在图3中,第20行代码发生了向上转型,将Dog类的实例转换成了Animal类的实例an,第21行代码是将Animal类的实例转换为Dog类的实例。第22行代码使用dog对象调用shout()方法,由于Animal类的shout()方法已被子类Dog类重写,因此dog对象调用的方法是被子类重写过的方法。

注意:

在向下转型时,不能直接将父类实例强制转换为子类实例,否则程序会报错。例如,将图3中的第20~21行代码修改为下面一行代码,则程序报错。

Dog dog = (Dog)new Animal();        //编译错误

3.instanceof关键字

Java中可以使用instanceof关键字判断一个对象是否是某个类(或接口)的实例,语法格式如下:

对象 instanceof类(或接口)

在上述格式中,如果对象是指定类的实例对象,则返回true,否则返回false。下面通过一个案例演示instanceof关键字的用法,如图4所示。

图4: 

 图4运行结果:

在图4中,第2~6行代码定义了Animal类;第8~16行代码定义了Dog类继承Animal类;第20行代码实例化Dog类对象,并将Dog类实例向上转型为Animal类对象a1。第21行代码通过instanceof关键字判断对象a1是否是Animal类的实例,第22行代码通过instanceof关键字判断对象a1是否是Dog类的实例;第23行代码实例化了一个Animal类对象a2,第24行代码通过instanceof关键字判断对象a2是否是Animal类的实例,第25行代码通过instanceof关键字判断对象a2是否是Dog类的实例。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值