多态
多态: 一种事物的多种状态
多态使用的规则:
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("里鬼剑术");
}
}