0

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

发生了什么事?创建?在编译时和运行时?

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

对不起,我知道我的英语不好,也请让你的答案和例子尽可能对初学者友好。

4

4 回答 4

1

早期装订就像从冰箱里取出西红柿,然后在开始煮汤之前把它们放在桌子上。

后期装订是开始煮汤,当你需要西红柿时,你就去冰箱里拿。

煮汤是运行时间。

准备好刀、勺子和平底锅是编译时间。(它不涉及西红柿。)


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

后期绑定:

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

早期绑定

myvar = new object;
... get :
return myvar
于 2012-04-30T01:11:01.267 回答
0

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

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

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

于 2012-04-30T09:29:15.680 回答
0

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

发生了什么事?创建?在编译时和运行时?

这取决于您所说的“对象”是什么意思。如果您的意思是类实例,那么是的,它将在运行时在堆栈或堆上创建。静态分配的对象,如明确声明为静态的字符串或类型,将在编译时在数据段中创建。静态变量在程序的整个生命周期中都存在。

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

来自维基百科

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

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

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

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

于 2012-04-30T02:30:27.350 回答
0

早期绑定是将值分配给设计时,而后期绑定是将值分配给运行时
。运行时和设计时之间只有区别,它必须显示分配的值。
例如:

//early binding 
myvar =new myvar();
// get
retutn myvar
于 2014-04-12T08:42:45.640 回答