面向对象的三个基本特征----多态

多态

多态: 一种事物的多种状态

多态使用的规则:

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("里鬼剑术");
	}
}

猜你喜欢

转载自blog.csdn.net/lijock/article/details/80286050