前言:
当前你们对“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方法可以覆盖吗