多态的含义
多态为对象可以表现出的多种形态。
多态的技术基础是继承和接口的实现。
程序的抽象体系即多态的生存土壤。
多态即为向上转型。
public abstract class Tools{
}
public interface Attackable{
}
public class Hammer extends Tools implements Attackable{
//Hammer可以向上转型为Tools,也可以转型为Attackable
//这就是多态的体现
}
使用多态后程序成员的表现
成员变量和静态方法
- 编译期:如果生声明类型的类中不存在被访问的成员变量和静态方法则编译失败。
- 运行时:使用声明类型的类中的成员变量,调用声明类型中的静态方法。
即在多态下访问成员变量是来自等号左侧的类型
在多态下调用的静态方法是等号左侧的类型
注意:不推荐使用引用变量调用静态方法或访问静态变量,应使用类型名称调用或访问
实例方法
- 编译期:如果声明类型的类中不存在被调用的实例方法,则编译失败。
- 运行时:调用被实例化的类型中的实例方法。
即在多态下调用实例方法,编译器看等号左侧类型中的
public abstract class Profession{
int grade = 1;
static int maxGrade = 60;
public String get
}
向上转型向下转型的时机
向上转型
- 当不需要直接面对子类类型时,可以通过向上转型降低程序耦合度。
- 使用父类的功能就能完成相应的需要。
用更抽象的类型声明变量,用更具体的类型实例化变量,让抽象类型的变量引用具体类型的对象。
Person p1 =new Student
向下转型
当需要使用子类的特殊行为时
注意:在不同的程序场景下使用同一个子类的不同抽象类型或接口类型声明可以避免发生向下转型。