Java教程-详解 Java 中的静态绑定和动态绑定

将方法调用与方法体关联起来被称为绑定。
在Java中,有两种类型的绑定:
- 静态绑定(也称为早期绑定):在编译时确定方法的调用。
- 动态绑定(也称为后期绑定):在运行时根据实际对象类型确定方法的调用。
理解类型
让我们来了解一下对象的类型。
1)变量具有类型
每个变量都有一个类型,它可以是原始类型或引用类型。
int data=30;
这里的数据变量是一种 int 类型。
2)引用有一个类型
class Dog{
public static void main(String args[]){
Dog d1;//这里d1是Dog的一种
}
}
3)对象有类型
对象是特定 java 类的实例,但它也是其超类的实例。
class Animal{}
class Dog extends Animal{
public static void main(String args[]){
Dog d1=new Dog();
}
}
这里 d1 是 Dog 类的一个实例,但它也是 Animal 的一个实例。
静态绑定
当对象的类型在编译时(由编译器)确定时,称为静态绑定。
静态绑定发生在以下情况下:
- 当调用类中的私有方法时。
- 当调用类中的最终方法时。
- 当调用类中的静态方法时。
在这些情况下,编译器能够确定方法的调用,因为它们与类的定义相关,并且不会受到运行时对象的影响。
静态绑定示例
class Dog{
private void eat(){System.out.println("狗正在吃东西");}
public static void main(String args[]){
Dog d1=new Dog();
d1.eat();
}
}
动态绑定
当对象的类型在运行时确定时,称为动态绑定。
动态绑定示例
class Animal{
void eat(){System.out.println("动物正在吃东西...");}
}
class Dog extends Animal{
void eat(){System.out.println("狗正在吃东西...");}
public static void main(String args[]){
Animal a=new Dog();
a.eat();
}
}
输出:
狗正在吃东西...
在上面的例子中,编译器无法确定对象类型,因为 Dog 的实例也是 Animal 的实例。所以编译器不知道它的类型,只知道它的基类型。