多态

本文深入探讨Java中多态的定义、理解、条件、作用及应用实例,阐述多态如何增强代码健壮性,通过实例展示如何在Java中利用多态特性实现代码的灵活复用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.多态是java中封装和继承之外的第三个基本特征,我觉得也是java最核心的东西,也叫动态绑定,或者后期绑定,或者运行时绑定。在执行期间(而非编译期间)判断所引用对象的实际类型,根据其实际的类型调用相应的方法。

2. 多态理解起来比较抽象一些,举个例子,宝马是车,台灯是灯,拿铁是咖啡,吉他是乐器。

多态的存在有3个条件,1)要有继承 2)要有重写3)父类引用指向子类对象

(说两句,为什么重写是必要的,首先不重写,继承了就可以用,没什么意义。也就是说,假如父类有一个方法,子类没有重写,或者甚至连定义都没有,那么就相当于继承。仍然可以调用父类的该方法。只是没什么意义而已。

其次,需要说明的一点是,如果使用了多态,子类调用某方法,若父类没有该方法,那么就出错,所以必须是重写才能保证父类肯定有该方法) 

3.我们常常先定义一个类,然后另一个类继承它,我们说,前者叫父类,后者叫子类。比如上面的例子。那么多态的字面意思也就是这样,“子类”是“父类”,换句话说,父类的引用可以指向子类的对象。

4. Car car = new BMW();

当使用多态调用方法时,首先检查父类中是否有该方法,如果没有,则编译器会报错;如果有,再去调用子类的方法。

特别注意:当继承的时候,子类会继承父类的一切属性和方法,但是呢,只有方法支持后期绑定,而成员变量不支持,所以,使用多态的时候,成员变量的调用是和引用的类型保持一致的。方法支持后期绑定,所以对象是什么类型就用什么类型里面的方法。

但是,如果子类没有重写父类的,就会调用父类的。


5.一共有2种强制类型转换

1)向上类型转换(upcast),意思就是子类转换为父类。比如Cat类型转换为Animal类型。如下:
       
       Cat cat = new Cat();
       Animal animal = cat;
网上找到一个很好的例子:http://zhidao.baidu.com/question/72034787.html

2)向下类型转换(downcast),意思就是父类转换为子类。比如Animal类型转换为Cat类型。
       Animal a = new Cat();
       Cat c =(Cat)a;

向下转换比较常见的情况就是返回值,调用了别人一个方法,返回一个类型的对象(假如说是Object类),而你想要更加精确的类型(比如String),而且你知道这个转换不会出现问题,这时候就要使用向下类型转换了。

//注意:举个例子,比如Integer是继承自Object的,所以向下可以转换,但是Integer[ ]和Object[]数组是不能转换的,因为根本就没有继承

对于向下类型转换,必须要显式地指定(必须使用强制类型转换)。


6.有了多态,那么就有了3种情况定义对象。
前面2种本身就有
1)父类的引用指向父类对象  Animal animal = new Animal();
2)子类的引用指向子类对象  Cat cat = new Cat();
这一种是有了多态以后的
3)父类的引用指向子类对象   Animal animal =new Cat();


7.要说好处,我觉得还是挺多的,简单一点说就是增强代码的健壮性

最常见的就是写一个接口,然后写一个子类,通过子类去调用一些方法。突然有一天,发现方法还是那些,但是想换个实现方法,如果以前写死了,那每次你有新想法了,都要重构代码,项目一旦大了,维护起来就很困难了。通过多态的方式,可以保证子类使用的方法父类全部都定义过了,于是你重新写一个子类,然后用父类的引用指向它,并不需要改原来的代码,改的仅仅是这一行代码的赋值语句。

总之,一旦项目大了,实现方式多样化了,多态的作用就会体现出来了。


注意: Java中除了static方法和final方法(private方法也属于final方法)之外,其它的方法都是后期绑定。

所以说,对于private方法,假如你在子类中重写了,然后使用了多态来调用,并不会调用子类的方法,因为方法根本就没有被重写,private方法是不能被重写的。但是编译器又不报错,所以在执行的时候仍然只会执行基类的方法,而不会执行子类所谓的"重写过的"方法。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值