在面向对象的思想中,可以把子类实例看作他的父类来进行方法调用。
例如,”形状”类具有绘画方法, “圆形”,”矩形”都属于形状的子类,他们都拥有绘画这一方法,但却又不同实现。
在实例化的时候我们可以这样写:
Shap s = new Circle();
或者
Shap s1 = new Cube();
,然后再调用他的绘画方法
s.showMe();
s1.showMe();
这样一来,Java无法在编译时就知道将要被调用的方法,而会在运行时进行调用方法的判断。
在其他非面向对象的语言中,方法的调用是通过“前期绑定”实现的。也就是说编译器将会产生一个具体的函数名字的调用,而链接器将这个调用解析到将要被执行的代码的绝对地址。
s.showMe();----->指向绝对地址
s1.showMe();----->指向绝对地址
然而在Java中。程序直到在执行的时候在能够知道确切的被调用的代码。所以这里采用了被称为”晚绑定”的机制:
当你调用方法的时候,被调用的代码直到运行时刻才能被确定。编译器确定被调用函数的存在,并对参数和返回值进行类型检查,但并不知道被执行的确切代码。
为了执行后期绑定,Java使用一小段代码来代替绝对地址调用。这段代码使用在对象中存储的信息来计算被调用的方法体的实际地址(详见第七章)。
showMe();----->指向一小段代码
这样,通过这一小段代码的内容,每一个对象都可以有不同的行为表现。当你调用一个对象的方法的时候,该对象通过以上机制就能够知道实际被调用的代码是什么。