多态解决了之前的疑问:左边是对象类型,右边是对象的构造器(执行的方法都在构造器里面)
Animal a = new Dog(); // 这是一个多态类型,左边是对象的类型,右边是该对象的构造器
传入的参数,为Animal类型,但是是Dog的构造器,所以执行的是Dog类的方法
运行流程:
多态下,不能访问子类独有功能(父类没有的):因为编译看左边(父类没有该方法,所以没有对该方法进行编译),只能访问重写的功能
package com.itheima.d2_polymorphic_advantage;
public class Test {
public static void main(String[] args) {
Animal a = new Tortoise();
go(a); // 传入的参数,为Animal类型,但是是Tortoise的构造器
Animal a2 = new Dog();
go(a2); // 由于是Dog的构造器,所以执行的是Dog方法
// a2.lookDoor(); 多态下,不能访问子类独有功能(父类没有的)
}
/**
* 要求:所有的动物都可以进来比赛
*/
public static void go(Animal a) { // 如果写Dog类,只有Dog类的对象能进来,如果是Animal就是所有的动物都能进来
System.out.println("开始.....");
a.run(); // 运行该对象的方法(看右边)
System.out.println("结束。。。。");
}
}
// 这是一个抽象父类
package com.itheima.d1_polymorphic;
public abstract class Animal {
public String name = "父类动物";
public abstract void run();// 就定义方法,让子类继承
}
// 这是一个子类
package com.itheima.d1_polymorphic;
public class Dog extends Animal{
public String name = "子类狗";
@Override
public void run() {
System.out.println("🐕跑的贼快~~");
}
}
// 这是一个子类
package com.itheima.d1_polymorphic;
public class Tortoise extends Animal{
public String name = "子类龟";
@Override
public void run() {
System.out.println("🐢根本跑不了");
}
}