目录
一、定义
二、注意事项
三、多态的好处
四、多态的弊端以及解决办法
一、定义
多态定义:多态是在继承/实现情况下的一种现象,表现为:对象多态、行为多态。
对象多态:都是同一对象,表现出不同角色,比如小明,既是学生,也是儿子。
行为多态:都是同一行为,表现出不同状态,比如跑步这种行为,有的人跑得快,有的人跑得慢。
二、注意事项
1.多态的前提
有继承/实现关系;存在父类引用子类对象;存在方法重写。下面这个图是一个多态的例子,里面注释有讲解
这个注释里面的的运行看左边,看的是创建对象时等号的左边。
2.多态是对象、行为的多态,Java中的属性(成员变量)不谈多态。
就是说类里的属性不会因为new的构造器不同而属性也变化。如下图这个例子,表明成员变量是不会多态的。只会调用父类的成员变量,要想调用子类的,就得进行类型强转,这篇文章后面会讲到类型强转。
三、多态的好处
1.在多态形式下,右边对象是解耦合的,更便于扩展和维护。
解耦合就是说可以替换的,比如写一个系统,分了好多模块去对接,当其中一个坏了的时候,就可以拿下来,换一个好的对接上去,这样使系统扩展和维护更方便。同理,在上一个例子中,当觉得Teacher()对象不好用了,可以换到Student(),
2.定义方法时,使用父类类型的变量作为形参,可以接收一切子类对象,扩展性更强、更便利.
案例:
就是定义一个方法,这个方法的形参是那个父类类型的变量,在这里就是People p,这样他子类对象(Student s和Teacher t)都能做他的实参。扩展性更强。
四、多态的弊端以及解决办法
1.弊端:多态下不能使用子类的独有功能(子类的独有方法)。
因为他编译的时候看的是左边,就是父类有没有这个功能,没有的话是不能直接调用的。
2.解决办法:用多态的强制类型转换
3.多态的类型转换,分为自动类型转换,强制类型转换
自动类型转换:父类 变量名 = new 子类(); //这样写,new的时候会自动把子类的对象自动给到父类的变量。但是这种变量不能调用子类的方法。
强制类型转换:子类 变量名=(子类)父类变量//把父类类型的变量转换为子类类型的变量。这样这个变量就可以调用子类的方法了。
4.注意事项:
(1)存在继承/实现关系就可以在编译阶段进行强制类型转换,编译阶段不会报错。
(2)运行时,如果发现对象的真实类型与强转后的类型不同,就会报类型转换异常(ClassCastException)的错误出来。
(3)建议强转前:使用instanceof关键字,判断当前对象的真实类型,再进行强转。
p instanceof Student
结束~