当前位置: 技术问答>java相关
帮忙解释一下三个术语:binding/late binding/virtual method invocation
来源: 互联网 发布时间:2015-03-06
本文导语: | binding:绑定,也可以说前期绑定,比如 System.out.println(s); 在编译过程中就绑定,并将代码拷贝到具体位置。 later binding:后期绑定,是面向对象实现多态的基本方法。 比如 abstract class Message { abstract void pla...
|
binding:绑定,也可以说前期绑定,比如 System.out.println(s);
在编译过程中就绑定,并将代码拷贝到具体位置。
later binding:后期绑定,是面向对象实现多态的基本方法。
比如
abstract class Message
{
abstract void play(ini t);
}
class TextMessage extends Message
{
public void play(int t)
{
......
}
}
class VoiceMessage extends Message
{
public void play(int t)
{
.....
}
}
当使用一下代码时候:
Message a=new TextMessage();
Message b=new VoiceMessage();
a.play();
b.play();
编译器并不知道a,b调用的是父类还是子类的方法,所以这时候
动态绑定介入了,他在继承树中查找适合的方法,然后发出正确调用
从而实现了基本的多态。
3 virtual method invocation
虚方法调用,在java里面并不存在这种说法,C++,delphi提供了虚函数,纯虚函数
的概念.(采用一个VMT的虚方法表来动态控制调用的方法)
其实跟java里面的抽象方法差不多。
必须对存在抽象方法的类继承然后实现此抽象方法。
给分吧,呵呵
在编译过程中就绑定,并将代码拷贝到具体位置。
later binding:后期绑定,是面向对象实现多态的基本方法。
比如
abstract class Message
{
abstract void play(ini t);
}
class TextMessage extends Message
{
public void play(int t)
{
......
}
}
class VoiceMessage extends Message
{
public void play(int t)
{
.....
}
}
当使用一下代码时候:
Message a=new TextMessage();
Message b=new VoiceMessage();
a.play();
b.play();
编译器并不知道a,b调用的是父类还是子类的方法,所以这时候
动态绑定介入了,他在继承树中查找适合的方法,然后发出正确调用
从而实现了基本的多态。
3 virtual method invocation
虚方法调用,在java里面并不存在这种说法,C++,delphi提供了虚函数,纯虚函数
的概念.(采用一个VMT的虚方法表来动态控制调用的方法)
其实跟java里面的抽象方法差不多。
必须对存在抽象方法的类继承然后实现此抽象方法。
给分吧,呵呵
|
Java中的非final实例方法,相当于C++的虚函数
Java中的抽象方法(接口或抽象类中),相当于C++的纯虚函数
绑定相当于定位具体要执行的代码
前期绑定就是编译时绑定/静态绑定,一般对overload而言
后期绑定就是运行时绑定/动态绑定,一般对override而言
[那么怎么在继承树中查找合适的方法呢?是找最低级的类的方法吗?]
- 对于前期绑定中的各overload方法的参数判定,遵循楼上大侠总结的“非分叉树
最低级类匹配原则”嘻嘻
- 对于动态绑定好象不存在这个问题,因为动态绑定严格按照runtime-type来
决定具体调用哪一个方法
但是有一个例外,我在蹭饭时,需要绑定一个大款(不是傍大款!嘻嘻),这个时候,我
是综合使用前期绑定和后期绑定者2种方法的,嘻嘻,具体算法如下:
- 吃饭前先分析一下(前期绑定),选定绑定目标,我一般是用分治策略在脑海中进行
快速排序(n*log2(n))。。。
- 吃饭后如果预先绑定目标溜走了,则马上进行后期绑定(不能耽误!)。。。
嘻嘻
Java中的抽象方法(接口或抽象类中),相当于C++的纯虚函数
绑定相当于定位具体要执行的代码
前期绑定就是编译时绑定/静态绑定,一般对overload而言
后期绑定就是运行时绑定/动态绑定,一般对override而言
[那么怎么在继承树中查找合适的方法呢?是找最低级的类的方法吗?]
- 对于前期绑定中的各overload方法的参数判定,遵循楼上大侠总结的“非分叉树
最低级类匹配原则”嘻嘻
- 对于动态绑定好象不存在这个问题,因为动态绑定严格按照runtime-type来
决定具体调用哪一个方法
但是有一个例外,我在蹭饭时,需要绑定一个大款(不是傍大款!嘻嘻),这个时候,我
是综合使用前期绑定和后期绑定者2种方法的,嘻嘻,具体算法如下:
- 吃饭前先分析一下(前期绑定),选定绑定目标,我一般是用分治策略在脑海中进行
快速排序(n*log2(n))。。。
- 吃饭后如果预先绑定目标溜走了,则马上进行后期绑定(不能耽误!)。。。
嘻嘻
|
在JAVA的SL275教程中有这个问题的讨论,很详细的,其实类的属性是编译其绑定,方法是运行期绑定。如下:
class Message
{
public void play(ini t);
{
System.out.println(t);
}
}
class TextMessage extends Message
{]
public int i;
public void play(int t)
{
......
}
}
class VoiceMessage extends Message
{
public int i;
public void play(int t)
{
.....
}
}
当使用一下代码时候:
Message a=new TextMessage();
Message b=new VoiceMessage();
a.i=3//错误,编译时绑定,message中无i属性
a.play();//运行其绑定,调用的是textmessage的play,而非message的play;
b.play();//运行其绑定,调用的是textmessage的play,而非message的play;
class Message
{
public void play(ini t);
{
System.out.println(t);
}
}
class TextMessage extends Message
{]
public int i;
public void play(int t)
{
......
}
}
class VoiceMessage extends Message
{
public int i;
public void play(int t)
{
.....
}
}
当使用一下代码时候:
Message a=new TextMessage();
Message b=new VoiceMessage();
a.i=3//错误,编译时绑定,message中无i属性
a.play();//运行其绑定,调用的是textmessage的play,而非message的play;
b.play();//运行其绑定,调用的是textmessage的play,而非message的play;