早期绑定后期绑定是否与运行时和编译时相同?

时间:2012-04-30 00:56:48

标签: java

当我们在函数内创建对象时,是在运行时创建的对象吗?

发生了什么事?产生的?在编译时和运行时?

早期绑定和后期绑定是否也意味着编译时和运行时? 什么是动态链接静态链接?当我听到静电时,是否认为编译时是正确的?该死的我很困惑?

抱歉,我知道我的英语很糟糕,请尽可能让你的答案和例子初学友好。

4 个答案:

答案 0 :(得分:1)

早期的装订就像从煮饭机中取出西红柿,然后在开始煮汤之前将它们放在桌子上。

后期装订正在开始煮汤,当你需要西红柿时,你会从冰箱中取出它们。

煮汤是运行时间。

准备好刀,汤匙和平底锅是编译时间。 (它不涉及西红柿。)


好的,这是一个伪编码的解释:

后期绑定:

... get : 
if (myvar is null) myvar = new object;
return myvar

早期绑定

myvar = new object;
... get :
return myvar

答案 1 :(得分:0)

  

当我们在函数内创建对象时,就是在该对象中创建的对象   运行

     

发生了什么事?产生的?在编译时和运行时?

这取决于你对“对象”的意思。如果你的意思是一个类实例,那么它将在运行时在堆栈或堆上创建。 Statically allocated对象,如显式声明为static的字符串或类型,将在编译时在data segment中创建。静态变量在程序的生命周期中存在。

  

早期绑定和后期绑定是否也意味着编译时和运行时?

来自Wikipedia

  

通过早期绑定,编译器会静态验证是否存在   或者使用适当的方法名称和签名的更多方法。这个   通常存储在编译的程序中作为虚拟的偏移量   方法表(“v-table”)并且非常有效。随着后期绑定   编译器没有足够的信息来验证方法   存在,更不用说绑定到v-table上的特定插槽。代替   该方法在运行时按名称查找。

简而言之,在早期绑定中,编译器在符号表中查找方法及其偏移量,以便信息必须可用,而在后期绑定中无法完成,运行时必须查找它。请注意,后期绑定与动态调度非常不同,尽管它们通常是同义使用的,因为后者指的是使用调度表或“vtable”来存储指向方法实现的指针,这可能会被覆盖。

  

什么是动态链接静态链接?

基本上,这是在最终可执行文件中包含引用文件或“库”(静态)并在运行时将它们放入程序映像之间的区别。显然,前者为可执行文件添加了不必要的大小,但(1)您永远不必担心依赖性问题,(2)程序启动更有效。另一方面,动态链接(1)节省空间,(2)允许库更新在一个地方发生。

答案 2 :(得分:0)

Java中没有任何内容是静态链接,但它静态绑定。 “静态”表示编译器标识要调用的函数的确切描述:类名,方法名,参数类型。它不会在内存中确定其地址。这是静态绑定和静态链接之间的区别,这意味着在编译时仍然不知道在调用静态方法时将执行什么代码。它取决于JVM在运行时加载的.class文件中的内容。 Java静态绑定对static方法的所有调用 - 因此关键字。它还将静态绑定应用于private方法,因为它们无法被覆盖。类似的论点适用于final方法。

动态绑定意味着编译器决定包含该方法的类在静态情况下的所有内容,除了。确切的类是在调用方法之前的最后一刻确定的,相对于调用该方法的对象。 Object.equals是一种动态绑定方法。这意味着相同的代码行每次执行时都可以调用不同的方法。

早期绑定==静态绑定;后期绑定==动态绑定。这些是同义词。

答案 3 :(得分:0)

早期绑定是对设计时间的赋值,其中后期绑定是对运行时值的赋值 运行时间和设计时间之间只有差异,必须显示分配值 例如:

//early binding 
myvar =new myvar();
// get
retutn myvar