[Java]静态绑定与动态绑定

版权声明:本文为博主原创文章,转载请申明出处,感谢。 https://blog.csdn.net/shichimiyasatone/article/details/85264565

一、绑定

 把一个方法与其所在的类/对象 关联起来叫做方法的绑定。绑定分为静态绑定(前期绑定)和动态绑定(后期绑定)。

二、静态绑定

静态绑定(前期绑定)是指:在程序运行前就已经知道方法是属于那个类的,在编译的时候就可以连接到类中,定位到这个方法。在Java中,final、private、static修饰的方法以及构造函数都是静态绑定的,不需程序运行,不需具体的实例对象就可以知道这个方法的具体内容。

三、动态绑定

动态绑定(后期绑定)是指:在程序运行过程中,根据具体的实例对象才能具体确定是哪个方法

动态绑定是多态性得以实现的重要因素,它通过方法表来实现:每个类被加载到虚拟机时,在方法区保存元数据,其中,包括一个叫做 方法表(method table)的东西,表中记录了这个类定义的方法的指针,每个表项指向一个具体的方法代码。如果这个类重写了父类中的某个方法,则对应表项指向新的代码实现处。

四、测试

private静态绑定:

public class A {
	private void aa() {
		System.out.println("aa");
	}

	public static void main(String[] args) {
		A a = new B();
		a.aa();
	}
}

class B extends A{
	public void aa() {
		System.out.println("bb");
	}
}

static静态绑定:

public class A {
	static void aa() {
		System.out.println("aa");
	}

	public static void main(String[] args) {
		A a = new B();
		a.aa();
	}
}

class B extends A{
	static void aa() {
		System.out.println("bb");
	}
}

输出:

因为private修饰所产生的静态绑定情况较为少见,static静态绑定较为常见。static方法不能被子类覆写,在子类中定义了和父类完全相同的static方法,则父类的static方法被隐藏。以测试代码为例,如果是A(){aa();}、A.aa()或者A a = new B(); a.aa()调用的都是父类的static方法aa()。

五、总结

对于形如下方的动态绑定:

  • f.dynamicMethod()方法调用能否编译成功,取决于Father中是否存在dynamicMethod()方法;
  • 调用方法执行哪段代码,取决于“ = ”号右侧的Son类在何处重写或继承了dynamicMethod()方法。(句中“或”理解为短路或)
Father f = new Son();
f.dynamicMethod();

对于形如下方的静态绑定:

  • f.staticMethod()方法调用能否编译成功,条件与动态绑定相同;
  • 调用方法执行哪段代码,取决于f变量类型Father类自身在何处实现或继承了staticMethod()方法。(句中“或”理解为短路或)
Father f = new Son();
f.staticMethod();

想要更多地了解Java程序编译和运行的过程,推荐看这篇博客,说的比较简洁。

关于方法表,推荐看这篇,从编译后的指令进行分析,有助于加深理解静态、动态绑定。

参考:https://www.cnblogs.com/ygj0930/p/6554103.html

猜你喜欢

转载自blog.csdn.net/shichimiyasatone/article/details/85264565