Bootstrap

动态绑定与静态绑定

目录

一、静态绑定

二、动态绑定


在Java中,静态绑定动态绑定是两种不同的绑定方式,用来决定在运行程序时哪个方法被调用。这两种绑定与多态性密切相关,尤其是在理解方法重载方法重写时非常重要。


一、静态绑定

静态绑定是指在编译时决定的绑定,编译器在编译阶段确定哪个方法或成员变量会被调用,即调用哪个方法或成员在编译时已经确定,不会在运行时改变。静态绑定适用于以下情况:

  • 方法重载:编译器根据方法的参数列表确定调用哪一个重载方法。
  • 静态方法:静态方法属于类而非对象,因此在编译时已经确定了调用的目标。
  • 私有方法:私有方法(被private修饰的方法)不能被子类访问或重写,因此它们的调用也是在编译时决定的。
  • final方法:  final修饰的方法不能被子类重写,因此编译器可以在编译时确定其调用。
  • 构造方法

二、动态绑定

动态绑定是指在运行时决定哪个方法被调用。它主要应用于方法重写的场景,即当子类重写父类的方法时,实际调用哪个方法会在程序运行时根据对象的实际类型决定,而不是引用的类型。

class Animal {
    public void sound() {
        System.out.println("Animal makes sound");
    }
}

class Dog extends Animal {
    @Override
    public void sound() {
        System.out.println("Dog barks");
    }
}

class Cat extends Animal {
    @Override
    public void sound() {
        System.out.println("Cat meows");
    }
}

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

        // 动态绑定:在运行时决定调用哪个方法
        animal1.sound();  // 输出:Dog barks
        animal2.sound();  // 输出:Cat meows
    }
}

在上面这个例子中,animal1和animal2都是Animal类型的引用,但它们指向的实际对象分别是Dog和Cat。通过动态绑定,在运行时根据实际对象的类型决定调用哪个sound()方法。



;