编译多态就是所谓的方法(函数)重载,即同一个方法(函数),根据参数的不同,内部实现逻辑可以不同。
比如
方法1(int a), 方法1(long a)
那么方法1在编译的时候,就被编译为2个不同方法,只是调用者可以很方便地根据实际的参数来调用方法。
当我们定义 int a 的时候,调用 方法1(a)时,程序就会自动调用 方法1(int a),而当我们定义 long a 的时候,调用 方法1(a)时,程序就会自动调用 方法1(long a),这样我们可以事先根据要求来编写我们的代码,只需要定义不同类型的a就可以了。
运行多态就是所谓的动态绑定,即同一个变量,根据运行时的条件赋予不同的“值(对象)”而使它的属性和行为不同。
比如
生物 a = new 人();那么变量a就具有 人 的属性和行为,
当a在某个条件下散失人性,变为畜牲的时候,即 a = new 畜牲(),通过给a重新赋值为畜牲对象,那么a就不再是人了,而是具有了畜牲本能的动物了。
一般来说,运行多态是用得最广泛的,因为很多时候,很多条件是编译期无法决定的,需要在运行期根据当前的执行条件来决定赋予什么样的“身份(对象)”。而编译多态,只有在我们事先知道需求条件的时候才会采用。不过运行多态也是建立在编译多态的基础上,即运行多态通过子类重写父类方法而实现的,此时,子类和父类的同名方法就不叫重载了,而叫重写或覆盖。这样,程序上,我们可以只调用父类的方法,而根据实际给变量赋予的子类对象来决定程序的执行结果。
比如
方法1(生物 a) {
a.说话();
}
那么,当我们调用方法1的时候,如果传入的a是人,那么a.说话()就是人类语言,而如果传入的a是畜牲,那么a.说话()就不知道是什么嚎叫了。