您的位置:首页 > 编程语言 > Java开发

java 方法调用绑定--《java编程思想》学习笔记

2014-03-28 23:29 381 查看
将一个方法调用同一个方法主体关联起来,就是绑定。 绑定分两种 :前期绑定 和 后期绑定 。

绑定-------------

| -----前期绑定-------编译期绑定 { static , final 方法 (private 方法属于final 方法);数据成员;}

|

|------后期绑定-------运行时绑定 { 普通的成员方法 ;}

总结:对于方法来说, 除了static 和final 方法外, 其他的方法都是后期绑定。

编译时对引用只检查被声明的类型,而不看实际类型。

将某个方法声明为 final 的作用-------

{ 防止该方法被覆盖,即告诉编译器,对此方法不需要动态绑定;}

多态产生的问题:

引用《java编程思想》(第四版)里的例子:

class Glyph{
void draw(){print("Glyph.draw();")}
Glyph(){
print("Glyph() before draw()");
draw();
print("Glyph() after draw()");
}
}

class RoundGlyph extends Glyph{
private int radius = 1;
RoundGlyph(int r){
radius = r;
print("RoundGlyph.RoundGlyph(), radius = " + radius);
}
void draw(){
print("RoundGlyph.draw(), radius =  "+ radius);
}
}

public class PolyConstructors{
public static void main(String[] args){
new RoundGlyph(5);
}
}

/*Output:
Glyph() before draw()
RoundGlyph.draw(), radius = 0
Glyph() after draw()
RoundGlyph.RoundGlyph(), radius = 5
*/
new 一个RoundGlyph 对象时,构造器的执行顺序 是: 父类 ----->子类, 所以, 先执行Glyph 的构造器,

然后执行 RoundGlyph 的构造器,但是,Glyph 的构造器调用了 draw 成员函数,所以该执行 Glyph 的draw 成

员函数? No,因为多态,对于一般成员函数来说, 运行时才绑定, 因为new 的是 RoundGlyph 对象, 所以

绑定的是RoundGlyph 的draw 函数,与此同时,RoundGlyph 的 成员radius 还没初始化,所以出现了 0 。

接下来,就轮到 RoundGlyph 的构造函数了,因为在构造函数里 ,RoundGlyph 的成员 radius 先初始化了,

然后执行 RoundGlyph 的draw 函数,所以,radius = 5。

总结: 尽量避免在构造器中调用其他方法,防止因多态产生一些意想不到的问题。

现在,我们来看看C++ 中会不会出现这样的问题,把java 代码改成C++:

#include<iostream>
using namespace std;

class Glyph
{
public:
Glyph(){
cout<<"Glyph() before draw() \n";
draw();
cout<<"Glyph() after draw()  \n";
}
void draw(){
cout<<"Glyph.draw();  \n";}
};

class RoundGlyph: public Glyph
{
public:
RoundGlyph(int r){
radius = r;
cout<<"RoundGlyph.RoundGlyph(), radius = "<< radius<<'\n';
}
void draw(){
cout<<"RoundGlyph.draw(), radius =  "<<radius<<'\n';
}
private:
int radius ;

};
int main(){
RoundGlyph * r = new RoundGlyph(5);
return 0;
}
运行结果为:



没有出现同样的问题,可以看出C++ 在多态的这个问题上表现得比较好。学 java 有一个作用,那就是让你

更好地理解 C++ 。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: