【问题标题】:early binding late binding is it same as runtime and compile time?早期绑定晚期绑定与运行时和编译时相同吗?
【发布时间】:2012-04-30 00:56:47
【问题描述】:

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

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

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

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

【问题讨论】:

  • 是的,对象在运行时被实例化。我不知道Java中甚至有“静态链接”的概念。我无法真正理解问题的其余部分。
  • 其实我只是听说过这个静态链接和动态链接链接我不知道这就是我问的原因。
  • 这些术语通常用于指代组装的机器代码,例如您可以在 C++ 库中静态链接或动态链接 dll 文件。在 Java 中并没有真正的精确模拟,因为所有内容都使用相同类型的类加载器加载。

标签: java


【解决方案1】:

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

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

煮汤是运行时间。

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


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

后期绑定:

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

早期绑定

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

【讨论】:

  • ObjectClass obj = new ObjectClass();
  • ObjectClass obj = new ObjectClass(); //这里是什么早期绑定,这里是什么后期绑定?
  • ObjectClass 是你的番茄(它已经准备好了),你正在将其中一个放到桌面上。这是一个早期的绑定。但是,如果您在事件或条件中使用它,如果在创建它之前必须发生某些事情,那就是后期绑定。
  • 您在事件或条件中的意思是什么?
  • 我已经在我的回答中解释过了。
【解决方案2】:

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

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

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

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

来自Wikipedia

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

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

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

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • “静态”在不同的上下文中表示不同的东西,其中有一些(打字、可见性、链接和加载、分配)。和后期绑定!=动态绑定:“后期绑定经常与动态调度混淆,但有显着差异。” ~en.wikipedia.org/wiki/Late_binding(第二段)
    • 您是在谈论 Java 还是一般的编程语言?我不是想给 OP 上 CS 课。
    【解决方案4】:

    早期绑定是对设计时的赋值,而后期绑定是对运行时的赋值
    运行时和设计时只有区别,它必须显示赋值的值。
    例如:

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

    【讨论】:

      猜你喜欢
      • 2010-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-12
      • 2023-04-03
      • 1970-01-01
      • 2016-12-15
      • 2016-01-01
      相关资源
      最近更新 更多