龙空技术网

深入理解Java中静态绑定与动态绑定的区别

一个即将退役的码农 216

前言:

当前你们对“javastatic方法可以覆盖吗”大概比较珍视,咱们都想要剖析一些“javastatic方法可以覆盖吗”的相关内容。那么小编同时在网络上收集了一些关于“javastatic方法可以覆盖吗””的相关内容,希望我们能喜欢,各位老铁们一起来了解一下吧!

为了理解 Java 中静态绑定和动态绑定的区别,首先要了解什么是绑定?绑定意味着引用和实际代码之间的链接,例如,当您引用一个变量时,它会绑定到定义它的代码,类似地,当您调用方法时,它会链接到定义方法的代码。Java中有两种方法绑定,静态绑定动态绑定。当在 Java 中调用方法时,它会在编译时或运行时绑定到实际代码,此时程序实际启动并创建对象。

顾名思义,静态绑定更多的是静态性质,因此它发生在编译时,即一旦您将 Java 源文件编译成类文件,您的代码就知道要调用哪个方法。由于它发生在程序生命周期的早期,它在 Java中也称为早期绑定。

另一方面,动态绑定发生在运行时,即 JVM 启动程序时。这次调用哪个方法是由一个实际的对象决定的,因为对象是在运行时创建的,所以在编译时是不可用的。由于它发生在程序生命周期的后期,因此在 Java中也称为后期绑定。

因此,这是 Java 中静态绑定与动态绑定之间的根本区别,一种在编译时早期使用引用变量的类型发生,而另一种在运行时后期使用实际对象发生。让我们看看更多不同之处以更好地理解这个概念。这也是Java 的常见问题之一,尤其是在前几轮中,所以在这里花时间绝对是值得的。

静态与动态绑定 Java

您可以在很多方面区分静态绑定和动态绑定,但最重要的是 JVM 如何使用它。你有没有想过如果作用域中有多个同名方法,JVM 是如何决定调用哪些方法的?

如果您曾经使用过方法重载方法覆盖,那么您就会知道在 Java 中可以有多个同名的方法。JVM 使用静态和动态绑定在 Java 中找到正确的方法。

Java中的静态和绑定示例

public class Main {    public static void main(String[] args) {        // An example of static and dynamic binding in Java        Insurance current = new CarInsurance();        // dynamic binding based upon object        int premium = current.premium();        // static binding based upon class        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";    }}Outputpremium : 200category : Insurance

在这个程序中,您将看到虚拟方法在编译时没有使用静态绑定,因为如果发生这种情况,那么超类中的方法将被调用,就像早期绑定的静态方法一样。由于调用了子类中的方法,证明实际对象在运行时用于函数绑定,因此动态绑定用于绑定虚方法。

您可以在这里看到对premium()方法的调用从子类执行该方法,而对category()方法的调用从超类执行。发生这种情况是因为premium()是一个虚拟方法,并且使用后期绑定来解决,而category()是一个静态方法,并且在编译时使用类名使用静态绑定来解决。

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

现在您已经了解并了解 Java 中方法调用是如何绑定的以及静态和动态绑定是如何工作的,让我们修改一下 Java 中静态和动态绑定之间的一些重要的关键区别:

1) 静态绑定发生在编译时,而动态绑定发生在运行。

2)由于静态绑定发生在程序生命周期的早期阶段,因此也称为早期绑定。同样,动态绑定也称为后期绑定,因为它发生在程序实际运行的后期。

3)静态绑定用于解析Java中的重载方法,而动态绑定用于解析Java中的重写方法。

4) 类似地,私有、静态和最终方法是通过静态绑定来解决的,因为它们不能被覆盖,并且所有虚拟方法都使用动态绑定来解决。

5) 在静态绑定的情况下不使用实际对象,而是使用类型信息,即引用变量的类型来定位方法。另一方面,动态绑定使用实际对象在 Java 中找到正确的方法。

这是一个很好的练习,它基于 Java 中的静态和动态绑定的概念,让我们看看你是否能回答这个问题:

让我们知道这个程序将打印什么?它是否会打印 Collection、Set 或 HashSet?

这就是Java 中早期(静态)和晚期(动态)绑定之间的区别。这是最好的 Java 电话面试问题之一,因为它提供了几个测试候选人 Java 知识深度的机会。永远记住,私有、静态和最终方法是使用静态绑定绑定的,而虚拟方法是使用动态绑定绑定的。

同样,方法重载是静态绑定的最佳示例,方法覆盖是动态绑定的示例。

标签: #javastatic方法可以覆盖吗