Java教程26—Java静态绑定和动态绑定

妖狐艹你老母 2022-05-13 01:54 334阅读 0赞

静态和动态绑定

方法调用与方法体的关联称为绑定
有两种类型的绑定:在编译时发生的静态绑定和在运行时发生的动态绑定。
在我解释java中的静态和动态绑定之前,让我们看一些可以帮助您更好地理解这个概念的术语。


什么是引用和对象?

  1. class Human{
  2. ....
  3. }
  4. class Boy extends Human{
  5. public static void main( String args[]) {
  6. /*这句代码简单创建了个Boy类型对象
  7. *并赋值了个引用*/
  8. Boy obj1 = new Boy();
  9. /* 因为Boy对象继承自Human对象,对象可以以这种方式创建。
  10. * 父类引用可以使用子类对象赋值
  11. */
  12. Human obj2 = new Boy();
  13. }
  14. }

Java中的静态和动态绑定

如上所述,方法定义与方法调用的关联称为绑定。
有两种类型的绑定:静态绑定和动态绑定。让我们讨论一下。

静态绑定或早期绑定

编译器在编译时可以解析的绑定称为静态或早期绑定。
static,private和final方法的绑定是编译时的。
为什么?原因是无法覆盖这些方法,并且在编译时确定类的类型。
让我们看一个例子来理解这个:

静态绑定示例
这里我们有两个类Human和Boy。
这两个类都有相同的方法walk(),但方法是静态的,这意味着它不能被覆盖。
所以即使我在创建对象obj时使用了Boy类的对象,它也会调用父类方法。
因为引用是Human类型(父类)。
因此,每当static,private和final方法的绑定发生时,类的类型由编译器在编译时确定,即绑定在编译时发生。

  1. class Human{
  2. public static void walk()
  3. {
  4. System.out.println("Human walks");
  5. }
  6. }
  7. class Boy extends Human{
  8. public static void walk(){
  9. System.out.println("Boy walks");
  10. }
  11. public static void main( String args[]) {
  12. /* 引用是Human类型
  13. * 对象是Boy类型
  14. */
  15. Human obj = new Boy();
  16. /* 引用是Human类型
  17. * 对象是Human类型
  18. */
  19. Human obj2 = new Human();
  20. obj.walk();
  21. obj2.walk();
  22. }
  23. }
  24. Output:
  25. Human walks
  26. Human walks

动态绑定或后期绑定

当编译器无法在编译时解析调用/绑定时,此类绑定称为动态绑定或后期绑定。
方法重写是动态绑定的一个完美示例。
因为在重写父类和子类时都有相同的方法,在这种情况下,对象的类型决定了要执行哪个方法
对象的类型在运行时确定,因此称为动态绑定。

动态绑定示例
这是我们在上面看到的相同的例子。
这里唯一的区别是,在这个例子中,覆盖实际上正在发生,因为这些方法不是static,private和final的。
在覆盖的情况下,对覆盖方法的调用在运行时由对象类型确定,从而发生后期绑定。让我们看一个例子来理解这个:

  1. class Human{
  2. //被重写的方法
  3. public void walk()
  4. {
  5. System.out.println("Human walks");
  6. }
  7. }
  8. class Demo extends Human{
  9. //重写方法
  10. public void walk(){
  11. System.out.println("Boy walks");
  12. }
  13. public static void main( String args[]) {
  14. /* 引用是Human类型
  15. * 对象是Boy类型
  16. */
  17. Human obj = new Demo();
  18. /* 引用是Human类型
  19. * 对象是Human类型
  20. */
  21. Human obj2 = new Human();
  22. obj.walk();
  23. obj2.walk();
  24. }
  25. }
  26. Output:
  27. Boy walks
  28. Human walks

正如您所看到的那样,输出与我们在静态绑定示例中看到的不同.
因为在这种情况下,在创建对象obj时,对象的类型被确定为Boy类型,因此调用Boy类的方法。
请记住,对象的类型是在运行时确定的。


静态绑定与动态绑定的区别

  • 静态绑定在编译时发生,而动态绑定在运行时发生。
  • static,private和final方法的绑定总是在编译时发生,因为这些方法无法被覆盖。
  • 当实际发生方法重写并将父类型的引用分配给子类类型的对象时,则在运行时期间解析此类绑定。
  • 重载方法是静态绑定,覆盖方法是动态绑定。

原文地址:

https://beginnersbook.com/2013/04/java-static-dynamic-binding/

发表评论

表情:
评论列表 (有 0 条评论,334人围观)

还没有评论,来说两句吧...

相关阅读

    相关 动态静态详解

    动态绑定和静态绑定详解 弄清调用对象方法的执行过程十分重要.下面是调用过程的详细描述: 1.编译器查看对象的声明类型(注意和实际类型区分)和方法名。假设调用x.f(pa

    相关 C++动态静态

    为了支持c++的多态性,才用了动态绑定和静态绑定。理解他们的区别有助于更好的理解多态性,以及在编程的过程中避免犯错误。 需要理解四个名词: 1、对象的静态类型:对象在

    相关 动态静态

    为了支持c++的多态性,才用了动态绑定和静态绑定。理解他们的区别有助于更好的理解多态性,以及在编程的过程中避免犯错误,需要理解四个名词: 1、对象的静态类型:对象在声明时采