您的位置 首页 java

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

为了理解 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";
    }
}
Output
premium : 200
category : Insurance  

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


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

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

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

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

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

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

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

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

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

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

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

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

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

文章来源:智云一二三科技

文章标题:深入理解Java中静态绑定与动态绑定的区别

文章地址:https://www.zhihuclub.com/182844.shtml

关于作者: 智云科技

热门文章

网站地图