Java面向对象三大特征 为:继承、封装、多态。前面两个还好理解一点,多态相对来说要难一下,不过多用代码练习,多去思考,还是可以理解的。
首先什么是多态?
多态指的是同一个方法的调用,由于对象的不同可能会有不同的行为。例如生活中,就比如休息的方法,渣渣辉的休息方法是玩贪玩蓝月,小明的休息方法是睡觉,小白的是旅游,王思聪的休息方法是陪女朋友去做爱做的事情对吧.........再比如说吃饭的方法,咱们中国人使用筷子,人家老外使用刀子叉子勺子,印度阿三就更奇葩了使用手抓....
多态需要注意的3点
1、多态是方法的多态,多态和属性是没有半毛钱的关系的。
2、多态存在的3个必要条件:
(1)、必须得有继承关系
(2)、子类必须重写了父类的方法
(3)、父类的引用指向子类对象:
3、父类的引用指向子类对象,用该父类的引用调用子类重写的方法,此时多态就出现了。
下面我们用代码测试一种比较常用的父类的引用作为方法的形参的情况:
执行结果如下:
解析:上面的例子可以很好的理解,父类引用做方法的形参,实参可以是任意的子类对象,可以通过不同的子类对象实现不同的行为方式。
我们传递的参数类型是酒的类型,但是我们在创建对象的时候是酒的类型的引用指向其子类的对象,比如: 酒 a = 茅台酒,参数类型传递的过程就好像我们喝酒的过程,假设我们都是品酒大师,能够喝出是什么牌子的酒,当我们没喝之前只能通过鼻子判断知道是酒,不知道是什么酒,喝一口才知道。同样,转换到程序中,编译的时候参数类型只知道是酒的类型,运行的时候(喝的时候)才具体知道是什么类型,从而调用对应的方法(知道是什么牌子的酒)。
如果没有多态,我们这里需要写很多重载的方法,非常的麻烦,由此,我们可以看出多态的主要优势是提高了代码的可扩展性,符合开闭原则。但是多态也有弊端,就是无法调用子类特有的功能,比如,我不能使用父类的引用变量调用五粮液酒类特有的say()方法。
那我们就是要使用子类特有的方法怎么破呢?对象的转型可破
注意:
父类型的引用指向子类型的对象,称为向上转型,属于自动类型转换
向上转型后的父类型引用变量,只能调用它编译类型(酒)的方法,不能调用它运行时类型(喝酒品尝出的具体酒)的方法,如果要使用 ,就要向下转型。(强制类型转换,和基本数据类型的强转差不多)
对象的转型:
运行结果为:
在向下转型的时候一定要注意问题,就是,转换的必须为运行时类型,不然会出现类型转换异常ClassCastException。
出现问题:
所以,我们可以使用instanceof运算符做运算再转换,