Java静态绑定和动态绑定
程序绑定的概念:
绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来。对java来说,绑定分为静态绑定和动态绑定;或者叫做前期绑定和后期绑定
静态绑定(早绑定 编译器绑定):
在程序执行前方法已经被绑定,此时由编译器或其它连接程序实现。例如:C 。针对java可以理解为程序编译期的绑定;特别说明一点,java当中的方法只有final,static,private和构造方法是前期绑定
动态绑定(迟绑定 运行期绑定):
后期绑定:在运行时根据具体对象的类型进行绑定。
若一种语言实现了后期绑定,同时必须提供一些机制在运行期间判断对象的类型,并分别调用适当的方法。也就是说编译器此时依然不知道对象的类型,但方法调用机制能自己去调查,找到正确的方法主体。不同的语言对后期绑定的实现方法是有所区别的。可以这样认为:它们都要在对象中安插某些特殊类型的信息。
动态绑定的过程:
虚拟机提取对象的实际类型的方法表
虚拟机搜索方法签名
调用方法
关于绑定相关的总结:
了解三者的概念之后,我们发现java属于后期绑定。在java中,几乎所有的方法都是后期绑定,在运行时动态绑定方法属于子类还是基类。但也有特殊,针对static方法和final方法由于不能被继承,因此在编译时就可以确定他们的值,他们是属于前期绑定。特别说明的一点,private声明的方法和成员变量不能被子类继承,所有的private方法都被隐式的指定为final的(由此我们知道:将方法声明为final类型的 一是为了防止方法被覆盖,二是为了有效的关闭java中的动态绑定)。java中的后期绑定是由JVM来实现的,我们不用去显式的声明它,而C++则不同,必须明确的声明某个方法具备后期绑定。java当中的向上转型或者说多态是借助于动态绑定实现的,所以理解动态绑定,也就搞定向上转型和多态。
对于java当中的方法而言,除了final,static,private和构造方法是前期绑定外,其他的方法全部为动态绑定。而动态绑定的典型发生在父类和子类的转换声明之下:
比如:Parent p = new Children();
具体过程如下:
1:编译器检查对象的声明类型和方法名。假设我们调用x.f(args)方法,并且x已经被声明为C类的对象,那么编译器会列举出C类中所有的名称为f的方法和从C类的超类继承过来的f方法
2:接下来编译器检查方法调用中提供的参数类型。如果在所有名称为f 的方法中有一个参数类型和调用提供的参数类型最为匹配,那么就调用这个方法,这个过程叫做“重载解析”
3:当程序运行并且使用动态绑定调用方法时,虚拟机必须调用同x所指向的对象的实际类型相匹配的方法版本。假设实际类型为D(C的子类),如果D类定义了f(String)那么该方法被调用,否则就在D的超类中搜寻方法f(String),依次类推
问题思考:
如何提供给方法使用者一个方法,来完成一个任务。如果使用者有特殊要求又要可以定制自己的方法?
涉及知识:
子父类,接口,向上转型,动态绑定
具体代码:
package com.chengxuyuanzhilu;
public interface MyInterfaces {
void doting();
}
package com.chengxuyuanzhilu;
public class Drink implements MyInterfaces {
@Override
public void doting() {
System.out.println("我在喝水");
}
}
package com.chengxuyuanzhilu;
public class Eat implements MyInterfaces {
@Override
public void doting() {
System.out.println("我在吃东西");
}
}
package com.chengxuyuanzhilu;
public class Run implements MyInterfaces {
@Override
public void doting() {
System.out.println("我在奔跑");
}
}
package com.chengxuyuanzhilu;
public class TestDynamicBind {
public static void main(String[] args) {
MyInterfaces my = null;
my = new Eat();
bind(my);
my = new Drink();
bind(my);
my = new Run();
bind(my);
}
static void bind(MyInterfaces my){
my.doting();
}
}
Java静态绑定和动态绑定的更多相关文章
- Java静态绑定与动态绑定
程序绑定的概念: 绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来.对java来说,绑定分为静态绑定和动态绑定:或者叫做前期绑定和后期绑定. 静态绑定: 在程序执行前方法已经被绑定(也就是说 ...
- java — 静态绑定和动态绑定
绑定:一个方法的调用与方法所在的类关联起来.java中的绑定分为静态绑定和动态绑定,又被称作前期绑定和后期绑定. 静态绑定:(final.static.private)在程序执行前已经被绑定,也就是说 ...
- Java字节码里的invoke操作&&编译时的静态绑定与动态绑定
一个一直运行正常的应用突然无法运行了.在类库被更新之后,返回下面的错误. Exception in thread "main" java.lang.NoSuchMethodErro ...
- java继承-静态绑定和动态绑定
静态绑定和动态绑定: 静态:程序执行前方法已经被绑定,针对java简单可以理解为程序编译器已的绑定(静态绑定)java当中的方法是final.static.private构造方法都是前期绑定 动态:运 ...
- java中的静态绑定与动态绑定
http://blog.csdn.net/u012420654/article/details/51945853 http://blog.csdn.net/zhangjk1993/article/de ...
- “全栈2019”Java第五十五章:方法的静态绑定与动态绑定
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- Java多态和动态绑定是如何实现的
最近深入学习java,看到了动态绑定和多态这一章节,但遗憾的是,大部分的相关文章都停留于表面文字的描述.不得已,最后google了几篇英文文章,在此总结下这个问题. 一.静态绑定和动态绑定的区别 在J ...
- Java多态之动态绑定
目录 Java多态之动态绑定 引用变量的类型 编译时类型 运行时类型 方法绑定 静态绑定 动态绑定 方法表 Java多态之动态绑定 上篇回顾:多态是面向对象程序设计非常重要的特性,它让程序拥有 更好的 ...
- C++中的静态绑定和动态绑定
C++在面向对象编程中,存在着静态绑定和动态绑定的定义,本节即是主要讲述这两点区分.我是在一个类的继承体系中分析的,因此下面所说的对象一般就是指一个类的实例.首先我们需要明确几个名词定义: 静态类型: ...
随机推荐
- C#创建类,方法,接口,字段 的 默认类型
1.在namespace中的类.接口默认是internal类型的,也可以显示的定义为public类型2.在一个类里面,属性和方法默认是private的,可以显示的定义为public.private.p ...
- get请求参数为中文,参数到后台出现乱码(注:乱码情况千奇百怪,这里贴我遇到的情况)
前言 get请求的接口从页面到controller类出现了乱码. 解决 参数乱码: String param = "..."; 使用new String(param.getByte ...
- HCNP学习笔记之PXE原理详解及实践
一.PXE简介 PXE(preboot execute environment,预启动执行环境)是由Intel公司开发的最新技术,工作于Client/Server的网络模式,支持工作站通过网络从远端服 ...
- c# c++通信--命名管道通信
进程间通信有很多种,windows上面比较简单的有管道通信(匿名管道及命名管道) 最近做个本机c#界面与c++服务进行通信的一个需求.简单用命名管道通信.msdn都直接有demo,详见下方参考. c+ ...
- 20145333《Java程序设计》课程总结
每周读书笔记链接汇总 第一周学习总结 第二周学习总结 第三周学习总结 第四周学习总结 第五周学习总结 第六周学习总结 第七周学习总结 第八周学习总结 第九周学习总结 第十周学习总结 实验报告链接汇总 ...
- linux input输入子系统分析《四》:input子系统整体流程全面分析
1 input输入子系统整体流程 本节分析input子系统在内核中的实现,包括输入子系统(Input Core),事件处理层(Event Handler)和设备驱动层.由于上节代码讲解了设备 ...
- android ramdisk
android ramdisk 1.android文件系统的结构android源码编译后得到system.img,ramdisk.img,userdata.img映像文件.其中, ramdisk.im ...
- 钓鱼WIFI搭建
1.无线网卡 2.KaliLinux操作系统,这里就不用说了,必备的 3.isc-dhcp-server服务器.安装好KaliLinux后只需要apt-get update 然后apt-get i ...
- java for语句执行顺序
public class test{ public static void main(String[] args) { int i=0; for(printChar ...
- LeetCode——Integer Replacement
Question Given a positive integer n and you can do operations as follow: If n is even, replace n wit ...