Java 静态和动态绑定

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

什么是引用和对象

class Human{
....
}
class Boy extends Human{
   public static void main( String args[]) {
       /*This statement simply creates an object of class
        *Boy and assigns a reference of Boy to it*/  
       Boy obj1 = new Boy();

       /* Since Boy extends Human class. The object creation
        * can be done in this way. Parent class reference 
        * can have child class reference assigned to it
        */
       Human obj2 = new Boy();
   }
}

Java 中的静态和动态绑定

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

静态绑定或早期绑定

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

静态绑定示例

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

class Human{
   public static void walk()
   {
       System.out.println("Human walks");
   }
}
class Boy extends Human{
   public static void walk(){
       System.out.println("Boy walks");
   }
   public static void main( String args[]) {
       /* Reference is of Human type and object is
        * Boy type
        */
       Human obj = new Boy();
       /* Reference is of HUman type and object is
        * of Human type.
        */
       Human obj2 = new Human();
       obj.walk();
       obj2.walk();
   }
}

输出:

Human walks
Human walks

动态绑定或后期绑定

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

动态绑定示例

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

class Human{
   //Overridden Method
   public void walk()
   {
       System.out.println("Human walks");
   }
}
class Demo extends Human{
   //Overriding Method
   public void walk(){
       System.out.println("Boy walks");
   }
   public static void main( String args[]) {
       /* Reference is of Human type and object is
        * Boy type
        */
       Human obj = new Demo();
       /* Reference is of HUman type and object is
        * of Human type.
        */
       Human obj2 = new Human();
       obj.walk();
       obj2.walk();
   }
}

输出:

Boy walks
Human walks

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

静态绑定与动态绑定

让我们讨论 Java 中静态和动态绑定之间的差异

  1. 静态绑定在编译时发生,而动态绑定在运行时发生。
  2. 私有,静态和最终方法的绑定总是在编译时发生,因为这些方法无法被覆盖。当实际发生方法覆盖并将父类型的引用分配给子类类型的对象时,则在运行时期间解析此类绑定。
  3. 重载方法的绑定是静态的,并且覆盖方法的绑定是动态的。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程