多态:polymorphism
多态: poly + morphism 许多形态
在希腊语中,poly指的是许多,morphism指的是形态
其中多态包括:
编译时多态
运行时多态
编译时多态:
在编译时决定编译所需要使用的目标方法。通常是父类所决定
运行时多态:
在运行时决定运行所需要使用的目标方法,通常是子类所决定,如果子类没有重写父类该方法,那么将使用父类的方法。
其实编译时多态和运行时多态就是我们常说的,编译看父类,运行看子类,在使用多态的时候,编译时应注意父类有无声明该方法,若无声明,那么将编译报错。
举例体现多态
创建一个父类
package Fs;
public class Father {
void eat () {
System.out.println("father eat");
}
void sleep() {
System.out.println("father sleep");
}
}
创建一个子类1,只重写父类的eat方法
package Fs;
public class Son_1 extends Father {
@Override
void eat() {
System.out.println("son1 eat");
}
}
创建一个子类2,重写父类的eat和sleep方法
package Fs;
public class Son_2 extends Father {
@Override
void eat() {
System.out.println("son_2 eat");
}
@Override
void sleep() {
System.out.println("son_2 sleep");
}
}
创建一个运行类:
package Fs;
public class Run {
public static void main(String[] args) {
System.out.println("=========父类对象==========");
Father f1 = new Father();
f1.eat();
f1.sleep();
System.out.println();
System.out.println("=========子类对象赋予父类引用,son1子类只重写eat方法=========");
Father f2 = new Son_1();
f2.eat();
f2.sleep();
System.out.println();
System.out.println("=========子类对象赋予父类引用,son2子类重写eat和sleep方法=========");
Father f3 = new Son_2();
f3.eat();
f3.sleep();
}
}
测试结果:由测试的结果,我们可以看到,当子类只重写了父类部分方法的时候,通过多态调用该方法,编译时候会先检查父类的该方法,编译通过以后,运行时检查子类有无重写该方法,如果有,那么将使用子类重写后的方法,没有则将使用父类的方法。
=========父类对象==========
father eat
father sleep
=========子类对象赋予父类引用,son1子类只重写eat方法=========
son1 eat
father sleep
=========子类对象赋予父类引用,son2子类重写eat和sleep方法=========
son_2 eat
son_2 sleep
多态的运用更多是在父类有通用的方法,子类对父类的方法有n种改写需求的时候,例如打游戏的时候,有兵种(父类)攻击方式(父类方法),这时候玩家就可以选择不同的兵(子类),然后就会用不同的攻击方式(子类方法)。
很多时候,多态的理解,建议还是自己写几个类感受一下。