📜  Java 静态绑定和动态绑定(1)

📅  最后修改于: 2023-12-03 15:31:34.530000             🧑  作者: Mango

Java 静态绑定和动态绑定

在面向对象编程中,绑定是指将方法调用连接到相应的方法实现的过程。在Java中,有两种绑定方式:静态绑定和动态绑定。

静态绑定

也称为早期绑定。当编译器能够推断出要调用哪个方法时,就会将方法调用绑定到该方法的实现上。静态绑定是在编译时完成的,因此也称为编译时绑定。

class Animal {
    public void eat() {
        System.out.println("Animal is eating");
    }
}

class Dog extends Animal {
    public void eat() {
        System.out.println("Dog is eating");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal animal = new Dog();
        animal.eat(); // 静态绑定
    }
}

在上面的示例中,尽管animal是Animal类型,但它实际上引用的是Dog对象。由于Java编译器能够推断出要调用Dog的eat()方法,因此会在编译时进行静态绑定。这意味着无论animal引用的是什么类型的对象,都会调用Dog的eat()方法。

输出:

Dog is eating
动态绑定

也称为晚期绑定。当编译器无法确定要调用哪个方法时,就会将方法调用绑定到相应的对象上,然后在运行时解析方法。这种绑定是在运行时完成的,因此也称为运行时绑定。

class Animal {
    public void eat() {
        System.out.println("Animal is eating");
    }
}

class Dog extends Animal {
    public void eat() {
        System.out.println("Dog is eating");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal animal1 = new Animal();
        Animal animal2 = new Dog();

        animal1.eat(); // 静态绑定
        animal2.eat(); // 动态绑定
    }
}

在上面的示例中,animal1引用的是Animal对象,因此会调用Animal的eat()方法。而animal2引用的是Dog对象,因此会调用Dog的eat()方法。由于在animal2的实例化过程中,Java编译器无法确定要调用哪个eat()方法,因此会在运行时进行动态绑定。

输出:

Animal is eating
Dog is eating
总结

静态绑定和动态绑定都是Java中重要的概念。静态绑定是在编译时完成的,动态绑定是在运行时完成的。静态绑定适用于编译器可以推断出要调用哪个方法的情况,而动态绑定适用于编译器无法推断出要调用哪个方法的情况。在实践中,大多数方法调用都是动态绑定的。