要了解Java 中
早期(静态)绑定和
晚期(动态)绑定 之间的区别,您必须首先了解什么是
绑定。链接意味着链接和代码之间存在联系。例如,您引用的变量绑定到定义它的代码。同样,被调用的方法也绑定到代码中定义它的位置。
Java 语言中的方法绑定有两种类型:早期绑定(也称为静态)和晚期
绑定(分别称为动态) 。在Java中调用方法意味着该方法绑定到特定的代码,无论是在编译时还是在运行时,当程序运行并创建对象时。顾名思义,静态链接本质上更静态,因为它发生在编译时,这意味着代码在将 Java 源代码编译成类文件后“知道”要调用哪个方法。由于这是指程序生命周期的早期阶段,因此也称为早期绑定。另一方面,动态链接发生在运行时,即程序由 Java 虚拟机运行之后。在这种情况下,调用哪个方法是由具体对象决定的,因此该信息在编译时不可用,因为对象是在运行时创建的。由于这种情况发生在程序生命周期的后期,因此在 Java 中称为后期绑定。
因此,Java 中静态绑定和动态绑定之间的根本区别在于,前者根据引用变量的类型在编译时早期发生,而后者在运行时使用具体对象发生较晚。 |
让我们看看更多的差异,以便更好地理解这一点,并能够回答 Java 面试中提出的这个非常流行的问题。
Java 中的早期和晚期绑定
Java 中的静态绑定和动态绑定有很多区别,但最重要的是 JVM 如何使用它们。您是否想知道当作用域内存在多个同名方法时,JVM 如何决定调用哪个方法?如果您曾经使用过方法重载或重写,您就会知道在 Java 中可以有多个同名的方法。对于 Java,JVM 使用静态和动态绑定来选择所需的方法。
Java中静态和动态绑定的示例
在此程序中,您将看到使用静态绑定在编译时不会发生虚拟方法的绑定,因为这会调用超类中的方法,就像早期绑定的静态方法一样。如果调用子类中的方法,则在运行时使用特定对象来绑定该函数,因此使用动态绑定来绑定虚函数。
public class Main {
public static void main(String[] args) {
Insurance current = new CarInsurance();
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 语言中使用动态绑定来解析方法重写。
- 同样,私有、静态和终端方法使用静态绑定来解析,因为它们不能被重写,而所有虚拟方法都使用动态绑定来解析。
- 在静态绑定的情况下,使用的不是具体对象,而是类型信息,即引用变量的类型,用于发现所需的方法。另一方面,动态绑定使用特定的对象来查找 Java 中所需的方法。
这是一个基于 Java 中静态和动态绑定概念的很好的练习。你能回答这个问题:
“执行下面的程序会输出什么?”
这个程序会输出什么?Collection
,Set
或者HashSet
? 这就是我们想要告诉您的有关Java 中
早期(静态)和
晚期(动态)绑定之间的差异的全部内容。这是最好的 Java 电话面试问题之一,因为它提供了很多测试候选人知识深度的机会。永远记住,
私有、
静态和
最终方法是使用静态链接绑定的,而
虚拟方法是使用动态链接绑定的。同样,静态绑定的最佳示例是方法重载,而重写是动态的。
来源
GO TO FULL VERSION