多态
一、什么是多态
多态性是面向对象编程的又一个重要特征,它是指在父类中定义的属性和方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为,这使得同一个属性或方法在父类及其各个子类中具有不同的含义。
二、何时使用到多态
例如教务管理系统:
定义有Teacher,Student,administrator三个类
在写注册方法的时候不应该每个类都写一遍,而是写一个通用的方法
所以写这三个对象的父类Person即可
多态还可以根据传递对象的不同,调用不同的子类方法(前提是方法在子类中重写)
以多态方式创建对象:Fu f = new Zi();
Person s = new Student();
s.setName("张三");
s.setAge(18);
Person t = new Teacher();
t.setName("李四");
t.setAge(32);
Person a = new Administrator();
a.setName("王五");
a.setAge(54);
register(s);
register(t);
register(a);
三、多态调用成员的特点
1.变量调用:编译看左边,运行也看左边。
在编译时会看父类中有没有这个变量,没有则报错,在运行时实际获取的就是左边父类中的成员变量的值
2.方法调用:编译看左边,运行看右边。
在编译时会看左边父类中有没有这个方法,运行的时候实际上调用子类的方法(重写方法)
理解:
成员变量:在子类的对象中,会把父类的成员变量也继承下来
成员方法:如果子类对方法进行了重写,那么在虚方法中是会把父类的方法覆盖的
优势:
一、在多态形式下,右边对象可以实现解耦合,便于扩展和维护
也就是只需要创建一个多态对象,后期可以直接修改这个对象的类,后面的代码不需要修改
二、定义方法的时候,使用父类型作为参数,可以接收所有子类对象,体现多态的扩展性与遍历
弊端:
一、假如父类中没有这个方法,不能调用子类中的方法
解决方案:将对象类型转换回类型:子类 变量名 = (子类) 多态名
判断对象类型:instanceof 例如a instanceof Dog d返回值为boolean
强制转换可以将对象转为子类类型,从而调用子类独有的功能,在转换前最好用instanceof判断