爪哇2博客
爪哇2博客

爪哇中早期绑定和晚期绑定之间的区别

爪哇中的绑定是指将方法或函数主体与Java编译器的方法或函数调用相关联的过程。用简单的话来说,当Java编译器调用一个函数时,为各个函数正确定位方法的任务就是绑定。根据编译器何时能够将方法主体与其方法调用相关联,java中的绑定分为两个主要标头:

  • 早期绑定,也称为静态绑定
  • 后期绑定,也称为动态绑定

让我们详细介绍这两种类型。

早期绑定或静态绑定

如前所述,绑定是指将方法主体与其调用关联或“绑定”的过程。早期绑定或静态绑定是指这两个实体在 编译时间 由Java编译器提供。静态绑定用于在执行任何执行之前将任何私有,最终或静态方法主体与其方法调用语句相关联。

为什么早期绑定会关联静态的final和private方法?

这是由于事实 静态的, 最后 或私有方法不能被任何子类覆盖,因此它们总是由常量引用(即定义它们的类)引用。由于静态,最终或私有方法的这种特性,java编译器可以轻松地确定预执行,这些方法只能由定义它们的类的对象引用。

以下示例将演示静态绑定。

代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
汽车 {
 
    上市 静态的 虚空 startEngine(){
        系统..打印(“汽车发动机启动”);
    }
}
 
上市 保时捷 延伸 汽车 {
 
    上市 静态的 虚空 startEngine(){
        系统..打印(“保时捷引擎启动”);
    }
 
    上市 静态的 虚空 主要( args[]){
 
        汽车 car1 = 保时捷();
        汽车 car2 = 汽车 ();
        car1.startEngine();
        car2.startEngine();
    }
}
 

输出量:

汽车发动机启动
汽车发动机启动

分析:

如果我们分析上述代码的输出,则会注意到,尽管重写了派生类Porsche中的“ startEngine”方法并使用类Porsche的引用初始化了对象“ car1”,但方法“ startEngine()”方法并未被覆盖并印上了超级跑车的文字。

这是由于以下事实:Car类的静态方法“ startEngine()”不能被覆盖,并且在编译过程中被Java编译器绑定。

现在让我们看看Binding的另一种形式:

后期绑定或动态绑定

如果编译器无法确定在编译过程中绑定了特定方法的哪个方法调用,则它诉诸于后期绑定或动态绑定。动态绑定的最佳实例是 方法覆盖。子类将覆盖超类的方法,并且在执行期间,方法将与它们各自的引用关联。

在此可能要注意,要使动态绑定发生,必须将要覆盖的方法声明为静态,最终或私有。使用上述任何修饰符声明该方法将防止其被覆盖,并且java将诉诸于静态绑定,因为它可以轻松确定父级引用。

让我们通过使用前面的示例来观察动态绑定。只有这次,这些方法将不再声明为“静态”

代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
汽车 {
 
    上市 虚空 startEngine(){
        系统..打印(“汽车发动机启动”);
    }
}
 
上市 保时捷 延伸 汽车 {
 
    上市 虚空 startEngine(){
        系统..打印(“保时捷引擎启动”);
    }
 
    上市 静态的 虚空 主要( args[]){
 
        汽车 car1 = 保时捷();
        汽车 car2 = 汽车 ();
        car1.startEngine();
        car2.startEngine();
    }
}
 

输出:

保时捷’s Engine Started
汽车发动机启动

分析:

输出上的差异非常明显,因为第一个方法调用已成功绑定了保时捷类的引用,并将其重写为“ startEngine()”方法。由于我们不再将static关键字用作方法的修饰符,因此Java编译器在编译期间找不到将方法绑定到的引用,因此诉诸于动态绑定,并且在运行时确定了方法的类型或引用。

静态和动态绑定之间的区别

静态绑定 动态绑定
静态或早期绑定在编译时进行。 动态绑定或后期绑定在运行时进行
声明为private,static或final的方法显示静态绑定,因为在编译过程中它们不能被覆盖并且可以关联 公用,受保护或默认的方法显示动态绑定,因为它们可以被覆盖并且它们的引用仅在运行时关联
早期绑定中未使用实际对象引用 使用实际对象参考
方法重载是静态或早期绑定的最佳示例 方法覆盖是动态绑定或后期绑定的主要示例

分享这个

作者

关注作者

相关文章

  • 11月04日

    我们可以重载Java中的main方法吗

    在这篇文章中,我们将看到"我们可以重载Java中的main方法吗"这是Core 爪哇面试中最常问到的问题之一。是的,我们可以在Java中重载main方法,但是当您运行程序时,JVM将搜索公共静态void 主要(String [] args)并执行该方法。 [中的重载主要方法…]

  • 11月2日

    爪哇中的动态方法分派

    在本文中,我们将介绍动态方法分派,也称为运行时多态。动态方法分派动态方法分派是一种在运行时而不是编译时解决对覆盖方法的调用的技术。当引用调用了覆盖方法时,则哪个版本的覆盖方法[…]

  • 10月29日

    我们可以覆盖Java中的静态方法吗

    不,我们不能在Java中覆盖静态方法。静态方法是可以在不创建类对象的情况下调用的方法,它们是类级别的方法。另一方面,如果子类具有与基类相同的方法签名,则称为方法重写。它的执行在运行时决定。以下是[…]

  • 8月26日

    用Java复制构造函数

    在这篇文章中,我们将看到copy constructor in 爪哇. Copy constructor is the constructor which takes parameter as object of same 类 and copy each field of the 类 to the 新 object. Unlike C++, 爪哇 does not provide default copy contructor. You need to create one, if you want to have copy […]

  • 8月26日

    爪哇默认构造函数

    在这篇文章中,我们将看到有关Java默认构造函数的信息。除非您显式提供任何其他构造函数,否则默认构造函数是由编译器插入的no arg构造函数。你赢了’无法看到它,因为它存在于类文件而不是源文件中。没有参数构造函数和[…]

  • 7月28日

    爪哇中的继承

    在这篇文章中,我们将看到有关Java继承的信息。除了抽象,封装和多态性,它是OOP的原理之一。简介继承这个词对每个人都很熟悉。通俗地讲,这个词是指代代相传的财产和特性。例如,[的属性或特征…]

发表评论

您的电子邮件地址不会被公开。 必需的地方已做标记 *

订阅我们的新闻

获取质量教程到您的收件箱。现在订阅。


成为朋友

©2020 爪哇2博客