1. Java的多态性总结:
(1) 首先, 要明确Child对Parent发生了方法的overload还是overwrite,根据参数类型及个数。
(2) 如果是overload,则Child继承了Parent的方法,相当于Child多加了父类的方法。
(3) 如果是overwrite, 则Child类不会有父类的该方法,而是把该方法重写了,所以该方法存在于父类中,子类只是重写了。要想调用父类的该方法,只能通过super关键字调用。
java 的这种机制遵循一个原则:[color=red]当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。 [/color]
(4) 接下来,观察方法执行时的参数类型;
(5) 然后看调用对象的声明类型和实例类型;
(6) 方法的调度采用最精确参数匹配。
2. 多态分两种:
(1) 编译时多态:编译时动态重载;
(2) 运行时多态:指一个对象可以具有多个类型,方法的覆盖
这样对于对象而言分为:
理解运行时多态:
Car c = new Bus();
Car编译时类型 编译时检查变量类型是否存在,是否有调用的方法。
Bus运行时类型 实际运行是访问heap中的对象,调用实际的方法。
运行时多态是由运行时类型决定的
编译时多态是由编译时类型决定的
(1) 首先, 要明确Child对Parent发生了方法的overload还是overwrite,根据参数类型及个数。
(2) 如果是overload,则Child继承了Parent的方法,相当于Child多加了父类的方法。
(3) 如果是overwrite, 则Child类不会有父类的该方法,而是把该方法重写了,所以该方法存在于父类中,子类只是重写了。要想调用父类的该方法,只能通过super关键字调用。
java 的这种机制遵循一个原则:[color=red]当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。 [/color]
(4) 接下来,观察方法执行时的参数类型;
(5) 然后看调用对象的声明类型和实例类型;
(6) 方法的调度采用最精确参数匹配。
2. 多态分两种:
(1) 编译时多态:编译时动态重载;
(2) 运行时多态:指一个对象可以具有多个类型,方法的覆盖
这样对于对象而言分为:
理解运行时多态:
Car c = new Bus();
Car编译时类型 编译时检查变量类型是否存在,是否有调用的方法。
Bus运行时类型 实际运行是访问heap中的对象,调用实际的方法。
运行时多态是由运行时类型决定的
编译时多态是由编译时类型决定的