多态:在继承/实现情况下的一种现象,表现为对象多态,行为多态
多态的前提:
有继承和实现的关系:存在父类和引用子类来进行创建对象,有进行方法重写使不同对象拥有不同效果的同一个属性
多态的注意事项:
多态指的使是对象,行为的多态。
JAVA中的属性(成员变量)不谈多态
.................................
people p1=new Student();
people p2=new Teacher();
p1.run();//行为多态,编译看左边,执行看右边
p2.run();//行为多态,编译看左边,执行看右边
System.out.println(p1.name);//输出父类的people的名称
System.out.println(p2.name);//输出父类的people的名称
左右边指在创建对象时的左右边代码类
于变量的执行: | 编译看左边: | 执行看左边 |
对于行为的多态: | 编译看左边 | 运行看右边 |
对象产生代码时左边即创建对象的实际构造器;右边即在父类(左边构造器下)产生的小类型
对于变量的执行:编译看左边:
执行看左边:对象的属性(成员变量)由此多态不包括成 员变量的多态
在上面例子中:print 变量的属性时
编译看的是people类;执行的时候看的还是people类
-------------------------------------
对于行为的多态:编译看左边类的代码,运行看右边类的代码
在上面例子中:编译指看的people类,执行的时候看的是 teacher/student;由此才产生了多态
----------------------------------------
使用多态的好处:多态的好处:便于拓展和维护
在多态的形式下,右边对象时解耦合的,更便于拓展和维护
people p1=new Student();
如peolple是父类而右边Student是子类
当对于s1如果需要不同的功能的切换,可以直接进行将Student(子类)进行切换,这样可以直接对功能的转换
定义方法时,使用父类类型的形象(形参),可以接受一切子类对象,拓展性更强,更便利。
如定义
多态的缺点:
在多态的状态下是不能够直接使用子类的独有功能
在直接进行使用对象的独有功能方法时会报错
所以多态不能够直接使用子类的单独功能
可以直接使用父类和子类都具有的如例子中的run方法
解决多态中不能直接调用子类单独功能(方法)的问题:
解决:
-----使用类型的转换:多态对象的命名时自动类型的转换
如:people p=new Student/Teacher;
强制类型的转换: 子类 变量名=(子类)父类变量
如:people p=new Student/Teacher;//多态对象的构建
强制类型转换的注意事项:
在进行强转时可以使用instanceof关键字来进行判断处理
具体操作:
创建p对象子类为Student用instanceof关键字来进行判断要转换的具体目标(这时在if条件中可以出现其他类名,关键在于if,else的代码书写)
为了便于检验的方便可以创建一个方法来将此代码放于方法中进行使用
为了能够将所有子类对象都能够进行一个转换父类的名称 +形参的名称
具体看上面介绍多态的好处
--------
存在继承/实现关系就可以在编译阶段进行强制类型的转换,编译阶段不会报错
运行时,如果发现对象的真实类型于强转后的类型不同,就会报类型错误的转换(ClassCastException)
即子类之间不能进行强转:
指的是,在创建多态对象2个不同子类下
在进行强转时新类型要与原来的子类相同
该图为正确的强准编译和执行都不会报错
...............................
即此图转换时是错误的
如果发现对象的真实类型于强转后的类型不同,就会报类型错误的转换(ClassCastException)
...............