多态
多态: 一种事物的多种状态
多态使用的规则:
1.类和类之间必须要有继承关系
2.要有对方法的重写(否则多态无意义)
3.(核心):父类的引用指向子类的对象空间---向上转型
多态的对象创建方式:
Animal aCat = new Cat; // 父类的引用(指针)指向子类的对象(空间) 向上转型 aCat.eat();
多态时 访问成员变量:
父类的引用只能访问子类空间中属于父类的那块空间
编译时 需要查看父类中是否有这个属性(成员变量),没有则出现编译错误
运行时 访问的是父类中的这个成员变量
结论: 当使用多态形式创建对象 访问成员变量时 编译和运行都看父类中的属性
多态时 调用成员方法:
编译时 需要查看父类中是否有该方法 没有则报错,有就编译通过
运行时 调用的是子类重写的父类的方法
结论: 当使用多态形式调用成员方法时 编译看父类 运行看子类(重写的父类方法)
使用多态的优点:
1. 减少代码量 提高工作效率 复用性强
相当于提高了代码的可维护性 (通过继承)
2. (核心)提高了方法的扩展性
多态的弊端:
当使用多态的方式创建对象时 无法直接调用子类中特有的方法
多态调用子类的特有方法时 需要注意:
必须要先有向上转型
才能进行向下转型
//创建多态对象 Person p = new PianZi(); // 向上转型 p.speak(); // 继承 共有方法 PianZi pZ = (PianZi)p; // 向下转型 将p强转为PianZi类型(子类) pZ.hit(); // 调用特有方法
多态的核心特点: 提升方法的扩展性
public class Play { public static void main(String[] args) { SharpShooter sharpShooter = new SharpShooter(); fun(sharpShooter); fun(new Swordman() ); } public static void fun(Part part){ // 调用重写的方法 part.name(); } } class Part { public void name(){ System.out.println("角色名字"); } } class SharpShooter extends Part{ // 重写父类方法 @Override public void name() { System.out.println("神枪手"); } // 特有方法 public void shoot() { System.out.println("子弹填充"); } } class Swordman extends Part { // 重写父类方法 @Override public void name() { System.out.println("剑士"); } // 特有方法 public void ability() { System.out.println("里鬼剑术"); } }