JAVA中动态绑定和静态绑定-static binding VS dynamic binding

前言:本文解决的问题

  • java中什么时候采用的是静态绑定
  • 什么时候是动态绑定
  • override VS overloading

1.静态绑定-static binding

在编译时候就可以编译器就可以准确知道该调用哪个方法的就是静态绑定。它们是static方法、private方法、final方法或者构造器,因为这些方法不能被覆盖override,编译器可以轻松决定调用谁。static binding又可以成为Early Binding。下面看例子:

public class StaticBindingVSdynamicBinding {

	public static void main(String[] args) {
		Human obj1 = new Human();
		Human obj2 = new Boy();
		obj1.walk();
		obj2.walk();
	}
}

class Human{
	public static void walk() {
		System.out.println("Human walks.");
	}
}
class Boy extends Human{
	public static void walk() {
		System.out.println("Boy walks.");
	}
}

猜猜输出是多少?

输出

Human walks. Human walks.

分析
由于walk()方法是静态的,编译器知道它在子类中不会被覆盖,因此在编译时就确定了调用哪个方法。如果把walk()方法前面的static去掉会怎样?这就是稍后要说的动态绑定。

2 动态绑定 dynamic binding

在编译时候编译器不知道要调用哪个方法,而是依赖于隐式参数的实际类型。当程序运行时,虚拟机根据每个类的方法表查找从而决定运行哪个方法。上面的例子中如果把static去掉,输出的结果会是以下:

Human walks. Boy walks.

分析
由于obj1是Human对象(依赖隐式参数的实际类型),因此调用的是Human中的walk方法;而obj2是Boy的对象,因此调用的Boy中的walk.

3 总结

  • private, static, final(方法和变量)使用静态绑定;对于其它方法就使用动态绑定
  • 静态绑定在编译时候就已经确定了,而动态绑定要在运行时才去欸的那个
  • 静态绑定使用类型信息(Type information);而动态绑定采用对象信息去解析绑定。
  • 重载Overloading运用在静态绑定中,而覆盖override则运用在动态绑定中
原文地址:https://www.cnblogs.com/java-learner/p/9656365.html