Java : 多态表现:静态绑定与动态绑定(向上转型的运行机制)

本来想自己写写的,但是看到有人分析的可以说是很清晰了,故转过来.

原文地址:http://www.cnblogs.com/ygj0930/p/6554103.html

一:绑定

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

二:静态绑定

静态绑定(前期绑定)是指:在程序运行前就已经知道方法是属于那个类的,在编译的时候就可以连接到类的中,定位到这个方法。

在Java中,final、private、static修饰的方法以及构造函数都是静态绑定的,不需程序运行,不需具体的实例对象就可以知道这个方法的具体内容。

三:动态绑定

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

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

动态绑定语句的编译、运行原理:我们假设 Father ft=new Son();  ft.say();  Son继承自Father,重写了say()。

1:编译:我们知道,向上转型时,用父类引用执行子类对象,并可以用父类引用调用子类中重写了的同名方法。但是不能调用子类中新增的方法,为什么呢?

因为在代码的编译阶段,编译器通过 声明对象的类型(即引用本身的类型) 在方法区中该类型的方法表中查找匹配的方法(最佳匹配法:参数类型最接近的被调用),如果有则编译通过。(这里是根据声明的对象类型来查找的,所以此处是查找 Father类的方法表,而Father类方法表中是没有子类新增的方法的,所以不能调用。)

编译阶段是确保方法的存在性,保证程序能顺利、安全运行。

2:运行:我们又知道,ft.say()调用的是Son中的say(),这不就与上面说的,查找Father类的方法表的匹配方法矛盾了吗?不,这里就是动态绑定机制的真正体现。

上面编译阶段在 声明对象类型 的方法表中查找方法,只是为了安全地通过编译(也为了检验方法是否是存在的)。而在实际运行这条语句时,在执行 Father ft=new Son(); 这一句时创建了一个Son实例对象,然后在 ft.say() 调用方法时,JVM会把刚才的son对象压入操作数栈,用它来进行调用。而用实例对象进行方法调用的过程就是动态绑定:根据实例对象所属的类型去查找它的方法表,找到匹配的方法进行调用。我们知道,子类中如果重写了父类的方法,则方法表中同名表项会指向子类的方法代码;若无重写,则按照父类中的方法表顺序保存在子类方法表中。故此:动态绑定根据对象的类型的方法表查找方法是一定会匹配(因为编译时在父类方法表中以及查找并匹配成功了,说明方法是存在的。这也解释了为何向上转型时父类引用不能调用子类新增的方法:在父类方法表中必须先对这个方法的存在性进行检验,如果在运行时才检验就容易出危险——可能子类中也没有这个方法)。

四:区分

程序在JVM运行过程中,会把类的类型信息、static属性和方法、final常量等元数据加载到方法区,这些在类被加载时就已经知道,不需对象的创建就能访问的,就是静态绑定的内容;需要等对象创建出来,使用时根据堆中的实例对象的类型才进行取用的就是动态绑定的内容。

原文地址:https://www.cnblogs.com/cccy0/p/9277649.html

时间: 2024-10-10 14:19:35

Java : 多态表现:静态绑定与动态绑定(向上转型的运行机制)的相关文章

Java方法的静态绑定与动态绑定讲解(向上转型的运行机制详解)

一:绑定 把一个方法与其所在的类/对象 关联起来叫做方法的绑定.绑定分为静态绑定(前期绑定)和动态绑定(后期绑定). 二:静态绑定 静态绑定(前期绑定)是指:在程序运行前就已经知道方法是属于那个类的,在编译的时候就可以连接到类的中,定位到这个方法. 在Java中,final.private.static修饰的方法以及构造函数都是静态绑定的,不需程序运行,不需具体的实例对象就可以知道这个方法的具体内容. 三:动态绑定 动态绑定(后期绑定)是指:在程序运行过程中,根据具体的实例对象才能具体确定是哪个

Java中的重载、重写、多态,静态绑定、动态绑定

重载,英文名是overload,是指在一个类中定义了一个以上具有相同名称的方法,这些方法的参数个数.参数类型和顺序不能相同.返回类型可以相同,也可以不同. public class TstaticOverload { static int height; TstaticOverload() { System.out.println ("Planting a seedling"); height = 0; } TstaticOverload(int initialHeight) { he

有关于多态和静态绑定与动态绑定的知识

一.多态 事物出现的多种体现形态(Java中指同一对象可以有不同类型的指向.) 1.多态的体现: 父类的引用指向了自己的子类的(或孙类)的对象. 父类的引用也可以接受自己的子类对象. 2.多态的前提: 1).必须是类与类之间有关系,要么继承.要么实现. 2).存在继承.  存在方法重写.   存在父类引用指向子类对象. 3.多态的好处: 提高了代码的复用性. 4.多态的弊端: 但是只能是父类的引用指向父类的成员. 5.多态的应用: 6.多态的代码特点(代码的注意事项) 1).多态中成员函数的特点

HappyBKs教你写Java注解(1)——注解的分类、运行机制、作用域及概念汇总

注解这东西,已经在我们的编程生活中习以为常了.覆盖一个父类的方法,套用Spring.Mybatis中的编程套路,编写JUnit测试函数等等.你会发现,作为一个Java Coder,你无时无刻不在接触它们. 但是如何编写一个属于自己的注解,或是希望能够看懂那些NB框架的源代码,都有必要让你我去掌握编写自定义注解的方法. 本系列开始,我将和博客的观众们一起学习java注解的开发. 注解分类(按照来源来分) jdk中的注解: @Override 重写父类的方法.如果父类没有该方法则编译报错 @Over

JAVA基础复习与总结<一>(2) 父类引用指向子类对象(向上转型、动态链接)

public class Animal { public static void main(String[] args){ Animal animal = new Cat(); animal.voice(); drinkWater(animal); //调用静态方法,传入的是父类引用的子类对象 } String str; public void voice(){ System.out.println("普通动物叫声!"); } public static void drinkWater

第一章 第二节 Java语言的运行机制

1.Java语言的运行机制 首先,我们介绍一下什么是计算机语言.对于计算机来说,真正能够直接执行的是所谓的"计算机指令".这种计算机指令,一方面跟着操作系统有关,也就是说,Windows系统和Linux系统下的指令不同.另一方面说,也跟计算机的硬件有关系,不同的CPU具有不同的指令集. 直接操作计算机指令,使用的是计算机语言以及汇编语言.然而,对于程序员来说,直接使用汇编语言来编写程序进行开发是非常慢的,为了能让程序开发的速度提升,设计出了计算机高级语言. 所谓的计算机高级语言,实际上

重新认识java(五) ---- 面向对象之多态(向上转型与向下转型)

多态,大概每个人都知道.但是,又有几个人真的理解什么是多态.多态有哪些细节呢?如果你看到这篇文章的名字,脑海中对多态没有一个清晰的概念,不妨点进来看看,也许会有收获. 什么是多态 简单的理解多态 多态,简而言之就是同一个行为具有多个不同表现形式或形态的能力.比如说,有一杯水,我不知道它是温的.冰的还是烫的,但是我一摸我就知道了.我摸水杯这个动作,对于不同温度的水,就会得到不同的结果.这就是多态. 那么,java中是怎么体现多态呢?我们来直接看代码: public class Water { pu

(原)java 向上转型中,任何域的访问操作都是由编译器解析,不是多态

最近在向java发力,学习学习了下.看到了多态这一节,书中有个比较好的例子,所以就准备写下来,记录下来: 1 package dynamic_binding01; 2 3 public class dynamic_binding01 { 4 5 public static void main(String[] args) { 6 // TODO Auto-generated method stub 7 Super super1=new Sub(); 8 System.out.println("s

Java入门记(二):向上转型与向下转型

在对Java学习的过程中,对于转型这种操作比较迷茫,特总结出了此文.例子参考了<Java编程思想>. 目录 几个同义词 向上转型与向下转型 例一:向上转型,调用指定的父类方法 例二:向上转型,动态绑定 例三:向上转型,静态绑定 例四:向下转型 转型的误区 1.运行信息(RTTI) 2.数组类型 3.Java容器 几个同义词 首先是几组同义词,由于在不同的书上使用的不同,是造成混淆的原因之一. 父类/超类/基类 子类/导出类/继承类/派生类 静态绑定/前期绑定 动态绑定/后期绑定/运行时绑定 向