关于 java 的动态绑定机制

聊一聊动态绑定机制, 相信看完这篇文章,你会对动态绑定机制有所了解。

网上大多一言概括:

当调用对象的时候,该方法会和该对象的内存地址/运行类型绑定。

当调用对象的属性时,没有动态绑定机制,哪里声明就使用哪里。

这里我们展开来说一说。

动态绑定机制,简单来说,就是在以父类为编译类型,创建子类对象的时候,绑定子类运行类型,当我们再调用方法的时候,能够有序的寻找方法,实现方法的有序调用。

动态绑定机制会出现在多态中,多态是 Java 的重要的三个属性之一,动态绑定机制就是建立在,封装,多态,继承的基础上延伸出的。

要了解动态绑定机制,首相要把对象的多态与继承搞明白,还有编译类型,运行类型,这是前提。网上都有详细的讲解,这里不做延伸。

废话不多书,直接上代码演示讲解,详细的讲解会在代码的注释当中。

首先我们要创建父类 Person 类

//创建父类
public class Person {
//简单的创建两个属性
private String name;
private int age; //创建行为方法,方法中调用创建的say方法
public void haviours(){
say();
}
//创建方法
public void say(){
System.out.println("我是人类!!!");
} }

创建子类 Student

//创建子类
public class Student extends Person {
//创建学生的属性
private int score;
//重写行为
public void haviours(){
say();
}
//重写say方法
public void say(){
System.out.println("我是学生!!!");
}
}

首先我们对 say 方法进行调用。

public class Demo01 {
public static void main(String[] args) {
//创建学生
Person student = new Student();
//调用学生的say()方法,由于我们的编译类型是Person类,而运行类型是Student类,而动态绑定机制是绑定运行类型。
//所以,当我们调用say()方法时,是调用Student类的say()方法
student.say();//返回“我是学生”
//、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
//如果我们将student类的say()方法注销,他寻找student类的say方法无果后,会再向它的父类调用say方法。返回我是人类,效果等同于 }
}

但是,重点来了。。。。。。。。。。。。

如果我们调用的是 haviours 方法,那么他的方法是调用什么呢

public class Demo02 {
public static void main(String[] args) {
//创建学生
Person student = new Student();
//调用学生的haviours方法,由于我们的编译类型是Person类,而运行类型是Student类,而动态绑定机制是绑定运行类型。
//所以,当我们调用haviours()方法时,该对象绑定的是Student类,所以是调用Student类的say()方法
student.haviours();//返回我是学生!!!
}
}

但是,还有人可能会有疑问,如果 Student 类中的 havious 方法被注释掉呢,你是不是会想。子类 Student 中没有 havious 方法,调用父类的 havious 方法,然后 havious 调用父类的 say 方法???

抱歉了,他调用的是子类 Student 的 Say 方法

public class Demo03 {
public static void main(String[] args) {
//创建学生
Person student = new Student();
//调用学生的haviours方法,由于我们的编译类型是Person类,而运行类型是Student类,而动态绑定机制是绑定运行类型。
//所以,当我们调用haviours()方法时,由于子类没有havious方法,调用父类的havious方法,在父类的havious中,调用say方法,这时,动态绑定机制是绑定运行类型。该对象绑定的是Student类,所以是调用Student类的say()方法
student.haviours();//返回我是学生!!!
}
}

介绍完动态邦迪机制对方法的绑定,接下来说一说对属性的影响。

当调用对象的属性时,没有动态绑定机制,哪里声明就使用哪里。这句话十分容易理解。

也就是动态绑定机制对属性没有影响,放心调用。

动态绑定机制(完)。

结语:由于在网上查找相关的动态绑定机制时,看到没有动态绑定的详细讲解,而这也是一个小难点,所以翻阅书籍,进行了学习,并进行总结,世界上本没有路,走的人多了,也便有了路。

有兴趣可以加QQ一起讨论:3282300758

关于 java 的动态绑定机制的更多相关文章

  1. Java的动态绑定机制

    Java的动态绑定又称为运行时绑定.意思就是说,程序会在运行的时候自动选择调用哪儿个方法. 一.动态绑定的过程: 例子: public class Son extends Father Son son ...

  2. 【解惑】Java动态绑定机制的内幕

    在Java方法调用的过程中,JVM是如何知道调用的是哪个类的方法源代码? 这里面到底有什么内幕呢? 这篇文章我们就将揭露JVM方法调用的静态(static binding) 和动态绑定机制(auto ...

  3. JAVA 初识类加载机制 第13节

    JAVA 初识类加载机制 第13节 从这章开始,我们就进入虚拟机类加载机制的学习了.那么什么是类加载呢?当我们写完一个Java类的时候,并不是直接就可以运行的,它还要编译成.class文件,再由虚拟机 ...

  4. Java 的类加载机制

    Java 的类加载机制 来源 https://www.cnblogs.com/xiaoxi/p/6959615.html 一.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内 ...

  5. 我竟然不再抗拒 Java 的类加载机制了

    很长一段时间里,我对 Java 的类加载机制都非常的抗拒,因为我觉得太难理解了.但为了成为一名优秀的 Java 工程师,我决定硬着头皮研究一下. 01.字节码 在聊 Java 类加载机制之前,需要先了 ...

  6. 面试官,不要再问我“Java虚拟机类加载机制”了

    关于Java虚拟机类加载机制往往有两方面的面试题:根据程序判断输出结果和讲讲虚拟机类加载机制的流程.其实这两类题本质上都是考察面试者对Java虚拟机类加载机制的了解. 面试题试水 现在有这样一道判断程 ...

  7. [转]Java虚拟机类加载机制

    原文地址:http://blog.csdn.net/u013256816/article/details/50829596 看到这个题目,很多人会觉得我写我的java代码,至于类,JVM爱怎么加载就怎 ...

  8. 深入理解Java的反射机制

    https://blog.csdn.net/u012585964/article/details/52011138 http://www.importnew.com/20339.html 一,java ...

  9. 面试官,不要再问我“Java虚拟机类加载机制”了(转载)

    关于Java虚拟机类加载机制往往有两方面的 面试题:根据程序判断输出结果和讲讲虚拟机类加载机制的流程.其实这两类题本质上都是考察面试者对Java虚拟机类加载机制的了解. 面试题试水 现在有这样一道判断 ...

随机推荐

  1. 好客租房53-context的使用

    app组件要传递给child组件 该如何处理 更好的姿势 跨组件传递数据 Provider 用来提供数据 Consumer用来消费数据 1调用React.createContext() 创建provi ...

  2. nodejs使用 svg-captcha 做验证码及验证

    一.需求 使用 nodejs 做后端开发,需要请求验证码,在 github 上看到了 svg-captcha 这个库,发现他是将 text 转 svg 进行返回的,安全性也有保证,不会被识别成文字. ...

  3. cpulimit-限制CPU速率

    CPULimit是一个简单的程序,它可以限制指定进程的CPU百分比. 1.安装依赖 root@localhost:~# apt-get -y install git 2.从GitHUB中克隆源码到本地 ...

  4. 对 Python 中 GIL 的一点理解

    GIL(Global Interpreter Lock),全局解释器锁,是 CPython 为了避免在多线程环境下造成 Python 解释器内部数据的不一致而引入的一把锁,让 Python 中的多个线 ...

  5. Python 生成图片验证码

    验证码图片生成 #!/usr/bin/env python # -*- coding: utf-8 -*- # refer to `https://bitbucket.org/akorn/wheezy ...

  6. uniapp小程序webSocket封装使用

    目录 1,前言 2,代码实现 3,使用 3.1,初始化 3.2,发送消息 3.3,接收消息 1,前言 最近在做IOT的项目,里面有个小程序要用到webSocket,借这个机会,封装了一个uniapp小 ...

  7. Linux Cgroup v1(中文翻译)(1):Control Group

    英文原文:https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v1/cgroups.html 1 控制组 1.1 什么是控制组? 控制组 ...

  8. torch.rand、torch.randn、torch.normal、torch.linespace

    torch.rand(*size, *, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False) # ...

  9. python+requests+yaml实现接口自动化用例(二)---升级版

    一.前言:前面一段时间封装的接口自动化测试框架用了一段时间发现还是有很多弊端的,目前又改良了一下,可以说整体思路全都推翻了,功能比之前强大许多,有兴趣的可以私信我单独交流,希望共同学习进步! 二.项目 ...

  10. ACM组合计数入门

    1 排列组合 1.1 排列 \[A_n^m=n(n-1)(n-2)\cdots(n-m+1)=\frac{n!}{(n-m)!} \] 定义:从 n 个中选择 m 个组成有序数列,其中不同数列的数量. ...