JavaRush /Java 博客 /Random-ZH /Java 中早期绑定和后期绑定的区别

Java 中早期绑定和后期绑定的区别

已在 Random-ZH 群组中发布
要了解Java 中早期(静态)绑定和晚期(动态)绑定 之间的区别,您必须首先了解什么是绑定。链接意味着链接和代码之间存在联系。例如,您引用的变量绑定到定义它的代码。同样,被调用的方法也绑定到代码中定义它的位置。
Java 中早期绑定和后期绑定的区别 - 1
Java 语言中的方法绑定有两种类型:早期绑定(也称为静态)和晚期绑定(分别称为动态) 。在Java中调用方法意味着该方法绑定到特定的代码,无论是在编译时还是在运行时,当程序运行并创建对象时。顾名思义,静态链接本质上更静态,因为它发生在编译时,这意味着代码在将 Java 源代码编译成类文件后“知道”要调用哪个方法。由于这是指程序生命周期的早期阶段,因此也称为早期绑定。另一方面,动态链接发生在运行时,即程序由 Java 虚拟机运行之后。在这种情况下,调用哪个方法是由具体对象决定的,因此该信息在编译时不可用,因为对象是在运行时创建的。由于这种情况发生在程序生命周期的后期,因此在 Java 中称为后期绑定。
因此,Java 中静态绑定和动态绑定之间的根本区别在于,前者根据引用变量的类型在编译时早期发生,而后者在运行时使用具体对象发生较晚。
让我们看看更多的差异,以便更好地理解这一点,并能够回答 Java 面试中提出的这个非常流行的问题。

Java 中的早期和晚期绑定

Java 中的静态绑定和动态绑定有很多区别,但最重要的是 JVM 如何使用它们。您是否想知道当作用域内存在多个同名方法时,JVM 如何决定调用哪个方法?如果您曾经使用过方法重载或重写,您就会知道在 Java 中可以有多个同名的方法。对于 Java,JVM 使用静态和动态绑定来选择所需的方法。

Java中静态和动态绑定的示例

在此程序中,您将看到使用静态绑定在编译时不会发生虚拟方法的绑定,因为这会调用超类中的方法,就像早期绑定的静态方法一样。如果调用子类中的方法,则在运行时使用特定对象来绑定该函数,因此使用动态绑定来绑定虚函数。
public class Main {
  public static void main(String[] args) {

    // Пример статического и динамического связывания в Java
    Insurance current = new CarInsurance();

    // Динамическое связывание на основе an object
    int premium = current.premium();

    // Статическое связывание на основе класса
    String category = current.category();

    System.out.println("premium : " + premium);
    System.out.println("category : " + category);
  }
}

class Insurance{
  public static final int LOW = 100;

  public int premium(){
    return LOW;
  }

  public static String category(){
    return "Insurance";
  }

}

class CarInsurance extends Insurance{
  public static final int HIGH = 200;

  public int premium(){
    return HIGH;
  }

  public static String category(){
    return "Car Insurance";
  }

}
Результаты выполнения:

premium : 200
category : Insurance
正如您所看到的,方法调用premium()导致子类方法的执行,而方法调用category()导致超类方法的执行。这是因为premium()- 是一个虚拟方法,它是使用后期绑定来解析的,而category()- 是一个静态方法,它是使用类名的编译时静态绑定来解析的。
有兴趣阅读有关 Java 的内容吗?加入Java 开发者小组!

Java 中早期绑定和后期绑定的区别

现在您已经了解了 Java 如何绑定方法调用以及静态和动态绑定如何工作,让我们回顾一下 Java 中早期绑定和后期绑定之间的主要区别:
  1. 静态链接发生在编译时,而动态链接发生在运行时。

  2. 由于静态链接发生在程序生命周期的早期,因此称为早期绑定。同样,动态绑定也称为后期绑定,因为它发生在程序执行的后期。

  3. Java 语言中使用静态绑定来解析重载方法,而 Java 语言中使用动态绑定来解析方法重写。

  4. 同样,私有、静态和终端方法使用静态绑定来解析,因为它们不能被重写,而所有虚拟方法都使用动态绑定来解析。

  5. 在静态绑定的情况下,使用的不是具体对象,而是类型信息,即引用变量的类型,用于发现所需的方法。另一方面,动态绑定使用特定的对象来查找 Java 中所需的方法。
这是一个基于 Java 中静态和动态绑定概念的很好的练习。你能回答这个问题: “执行下面的程序会输出什么?”
Java 中早期绑定和后期绑定的区别 - 2
这个程序会输出什么?CollectionSet或者HashSet 这就是我们想要告诉您的有关Java 中早期(静态)晚期(动态)绑定之间的差异的全部内容。这是最好的 Java 电话面试问题之一,因为它提供了很多测试候选人知识深度的机会。永远记住,私有静态最终方法是使用静态链接绑定的,而虚拟方法是使用动态链接绑定的。同样,静态绑定的最佳示例是方法重载,而重写是动态的。 来源
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION