浅谈java的绑定机制--多态的基础
何为绑定
-
何为绑定?绑定主要是用来处理java中出现的同名方法的选择问题的。绑定是将一个方法与方法所在的类绑定起来,从而决定调用哪个方法。
-
在java的编写中,经常无法避免的使用同名的方法,如Override或者Overload,当一个对象向上转型后,是否还能按照我们的意愿去执行某个方法,这一特性就要以绑定为基础实现。
绑定的类别
常见的绑定有静态绑定和动态绑定之分,也叫前期绑定和后期绑定。
静态绑定
所谓静态绑定,就是在编译过程就能完成的绑定。是否静态绑定也很好区分,在java中的private,final,static以及构造方法都是静态绑定的:
private方法
private方法只属于这个类,不能被子类继承以及复写.
因此从属关系很好判断,静态绑定就可以完成。
static方法
static方法可以被继承,但不会被子类重写,而是被隐藏。
这里可以理解为static方法是某一个类所公用的。再被子类继承后,如果没有Override操作,那么子类调用该方法名将会调用父类的方法;而如果进行Override操作,那么子类调用该方法名将会调用新写的方法。(任何一个方法都是这样)唯一区别于后面的动态方法的是,当子类向上转型为父类类型后再调用该方法,调用的将是父类的方法。这种绑定完全依赖于调用类的类型,静态绑定便可完成。
final方法
final方法可以被继承,但是不能被子类重写。
也就是说所有对该方法名的调用都是父类的那个final方法,不存在判断,静态绑定即可完成。我们往往通过将方法记为final来关闭动态绑定。
构造方法
构造方法和private一样,是无法被继承的,只能通过super或jvm默认调用,可以静态的完成绑定。
动态绑定
所谓动态绑定,就是在程序运行时,通过对类类型的判断来选择正确的方法去执行。
查阅资料得到动态绑定的大概实现过程:
- 虚拟机提取对象实际类型的方法表
- 虚拟机搜索方法签名
- 调用方法
有了动态绑定,我们就可以在向上转型后已经成功的调用重写的父类方法,为程序的编写提供了很大的便利。
多态的实现
下面写个例子来表述一下多态的情况:
class father
{
void f()
{
System.out.println("father");
}
}
class son extends father
{
@Override
void f()
{
System.out.println("son");
}
}
public class testone {
public static void main(String[] args) {
father person = new son();
person.f();
}
}/* Output:
son
*///:~
上一篇: 软件构造Lab2心得
推荐阅读