一.多态:一种事物的多中状态]
多态的规则(前提)
1.类和类之间,必须要有关系(继承关系)
2.必须要有方法的重写(没有重写的话,多态没有意义)
3.(核心)父类的引用(指针)指向子类的对象(子类的空间)
public class Demo01 { public static void main(String[] args) { //本类的引用(指针)指向 本类的对象(空间) Cat cat = new Cat(); cat.eat(); //多态的对象创建方式 //父类指针指向子类空间 Animal aCat = new Cat(); aCat.eat(); } } /* * * 需求: 创建 动物类 猫类 狗类 * 都有一个吃的方法 动物类 动物吃饭 * 猫 猫吃鱼 * 狗 狗吃骨头 */ class Animal{ public void eat() { System.out.println("动物吃饭"); } } class Cat extends Animal{ public void eat() { System.out.println("猫吃鱼"); } } class Dog extends Animal{ public void eat() { System.out.println("狗吃骨头"); } }
二.多态的使用
多态如何使用成员变量
父类的引用只能访问 子类空间中属于父类的那块空间
编译:编译时,要查看,父类中是否有这个属性,没有就报编译错误
运行:运行时,访问的是父类中这个成员变量
结论:当使用多态形式创建对象的时候,访问成员变量是,编译和运行都是看父类中的属性
多态调用成员的方法
编译:编译时,需要看父类中,是否有该方法,没有就报错,有就编译通过
运行:运行时,调用的是 子类重写父类的方法
结论:编译看父类,运行看子类
public class Demo02 { public static void main(String[] args) { //多态的创建形式 Father fSon = new Son(); fSon.print(); System.out.println(fSon.num); Son son = new Son(); son.print(); System.out.println(son.num); } } class Father{ int num = 10; public void print() { System.out.println(num); System.out.println("我是父类的 打印方法"); } } class Son extends Father{ int num = 20; @Override public void print() { System.out.println(num); System.out.println("我是子类的打印方法"); } }
三.多态的好处
1.减少代码量 提高工作效率 复用性强
相当于提高了代码的可维护性(指的是继承)
2.(核心)提高方法的扩展性
四.多态的弊端:
当使用多态的方式创建对象时,无法直接调用子类特有的方法
多态调用子类的特有方法时注意:
必须要先有向上转型才能进行向下转型
public class Demo03 { public static void main(String[] args) { //多态创建对象 //提升了骗子的逼格 //提升子类对象类型---向上转型 Person p = new PianZi(); p.speak(); //如何调用子类的特有方法 //把装成人的骗子打回原形 //向下转型 --- 强制类型转换 PianZi pZ = (PianZi)p; pZ.hit(); } } class Person{ public void speak() { System.out.println("聊天"); } } class PianZi extends Person{ @Override public void speak() { System.out.println("洗脑"); } //特有方法 public void hit() { System.out.println("打人 威胁人"); } }