java面试的时候经常会被问到一个问题,那就是java三大特性:继承,封装和多态。那么这三者的含义究竟是什么你真的清楚吗?我看网上大多都是人云亦云。所以我想把我的想法记录下来供大家参考~今天先聊一个,多态是什么呢?

  我们都知道,java程序是分为编译和运行两部分的,那你有没有想过,java的编译的期间是怎么判断你所写的方法是属于哪里的呢?没错,就是我们常说的绑定。绑定就是指把一个方法和方法的主体关联起来,对于java来说,绑定分为静态绑定和动态绑定。那这和我们的多态有什么关系呢!所谓的多态,就是指父类引用指向子类对象,这样调用的方法就是子类的实现而不是父类的实现,多态实现的核心就是我们上面说的动态绑定。这样说是不是有点迷?没事,往下看就知道了。

  首先说一下静态绑定:java程序运行前就可以知道这个方法所属的主体,实际上也就是java程序编译期间的绑定,java中的方法只有用private,final,static和构造方法是静态绑定。那么我们来回忆一下这几个东西的特点:

  private修饰的方法,不可以在子类当中被继承,所以自然也就和本类绑定到了一起。

  final修饰的方法,可以被继承,但是不可以被覆盖(重写),所以子类调用的都是父类当中的这个final方法,所以我们也可以了解到final 的作用:一,防止方法被覆盖,二,有效的关闭动态绑定。

  构造方法这个也不用多说,虽然网上有说继承这个类就默认继承了他的无参构造,但是我们都知道super关键字就是帮助子类调用父类的构造方法来实现初始化,而我们使用继承的方法则不需要那么做,所以编译器也可以看出这个方法的主体。

  static修饰的方法,可以被继承,但是不可以被覆盖,但是可以被子类隐藏。继承自然是指这个方法可以继承父类的静态方法,但是不能够重写,如果子类中有相同的方法时,父类的方法被隐藏起来,为什么这么说呢?因为如果将子类转型向上为父类时,那么调用该方法时使用的是父类的方法,所以是被隐藏起来。

  说完了静态绑定,我们说一下重要的动态绑定,那么如果一个方法在编译期间没办法判定方法的主体怎么办,那就需要我们的动态绑定,也就是运行期间的绑定。是如何实现的呢?不同的语言动态绑定的方法是不一样的,Java是什么样的呢?首先虚拟机提取对象实际类型的方法表,虚拟机查找方法签名,调用该方法。因此当虚拟机调用一个实例方法时,就会根据对象的实际的类型来选择相应的方法,这也就是我们所说的动态绑定。多态的实现方式,比如接口,重写或者抽象类和抽象方法都是基于这一个中心思想来实现的。

  综上,大家可以思考一下,成员变量或者类变量采用的是什么绑定呢?有没有什么办法可以使得静态绑定变为动态绑定呢?

java面试题——对于多态你是怎么理解的呢?不一样的角度,带你重新看java的更多相关文章

  1. 带着新人看java虚拟机07(多线程篇)

    这一篇说一下比较枯燥的东西,为什么说枯燥呢,因为我写这都感觉很无聊,无非就是几个阻塞线程的方法和唤醒线程的方法... 1.线程中断 首先我们说一说怎么使得一个正在运行中的线程进入阻塞状态,这也叫做线程 ...

  2. 带着新人看java虚拟机06(多线程篇)

    其实多线程还有很多的东西要说,我们慢慢来,可能会有一些东西没说到,那就没办法了,只能说尽量吧! 1.synchronized关键字 说到多线程肯定离不开这个关键字,为什么呢?因为多线程之间虽然有各自的 ...

  3. 带着新人看java虚拟机04(多线程篇)

    我记得最开始接触多进程,多线程这一块的时候我不是怎么理解,为什么要有多线程啊?多线程到底是个什么鬼啊?我一个程序好好的就可以运行为什么要用到多线程啊?反正我是十分费解,即使过了很长时间我还是不是很懂, ...

  4. 带着新人看java虚拟机03

    分享一篇博客:https://blog.csdn.net/yfqnihao/article/details/8289363,本篇有部分参考这篇博客!!! 还是继续说一下java虚拟机,为什么呢?因为我 ...

  5. 带着新人看java虚拟机02

    上一节是把大概的流程给过了一遍,但是还有很多地方没有说到,后续的慢慢会涉及到,敬请期待! 这次我们说说垃圾收集器,又名gc,顾名思义,就是收集垃圾的容器,那什么是垃圾呢?在我们这里指的就是堆中那些没人 ...

  6. 带着新人看java虚拟机01

    1.前言(基于JDK1.7) 最近想把一些java基础的东西整理一下,但是又不知道从哪里开始!想了好久,还是从最基本的jvm开始吧!这一节就简单过一遍基础知识,后面慢慢深入... 水平有限,我自己也是 ...

  7. 带着新人看java虚拟机05(多线程篇)

    上一篇我们主要是把一些基本概念给说了一下以及怎么简单的使用线程池,我们这一节就来看看线程池的实现: 1.线程池基本参数 以Executors.newFixedThreadPool()这种创建方式为例: ...

  8. 拼多多、饿了么、蚂蚁金服Java面试题大集合

    自己当初找工作时参加过众多一线互联网公司的Java研发面试,这段时间处于寒冬,然而前几天跳槽找工作,两天面了3家,已经拿了两个offer,觉得可以和大家分享下: 下面为拼多多.饿了么.蚂蚁金服.哈啰出 ...

  9. 金三银四季来了!Java 面试题大放送,能答对70%就去BATJTMD试试~

    摘要: 2019,相对往年我们会发现今年猎头电话少了,大部分企业年终奖缩水,加薪幅度也不如往年,选择好offer就要趁早,现在开始准备吧,刷一波Java面试题,能回答70%就去BATJTMD大胆试试~ ...

随机推荐

  1. Java实现 蓝桥杯VIP 算法提高 欧拉函数

    算法提高 欧拉函数 时间限制:1.0s 内存限制:512.0MB 说明 2016.4.5 已更新试题,请重新提交自己的程序. 问题描述 给定一个大于1,不超过2000000的正整数n,输出欧拉函数,p ...

  2. Android如何使用OKHttp

    首先要在build.gradle里面写入 // 添加OKHttp支持 implementation("com.squareup.okhttp3:okhttp:4.3.1") 下面是 ...

  3. Java实现复数运算

    1 问题描述 编程实现两个复数的运算.设有两个复数 和 ,则他们的运算公式为: 要求:(1)定义一个结构体类型来描述复数. (2)复数之间的加法.减法.乘法和除法分别用不用的函数来实现. (3)必须使 ...

  4. 掌握SpringBoot-2.3的容器探针:基础篇

    欢迎访问我的GitHub 地址:https://github.com/zq2599/blog_demos 内容:原创文章分类汇总,及配套源码,涉及Java.Docker.K8S.DevOPS等 关于& ...

  5. matplotlib 示例

    示例1 import numpy as np import matplotlib.pyplot as plt #plt.rcParams['font.family'] = ['sans-serif'] ...

  6. [Linux之旅一] .NET Core 2.2部署到Docker中

    第一步,使用VS2017或者VS2019创建.NET Core 2.2或3.1的项目,如下图: 在创建项目的时候记得勾选Docker支持,这样会自动创建Dockerfile文件,这个文件用于构建Doc ...

  7. 微信小程序session_key解析中反斜杠问题处理 Java解析

    Java服务端微信小程序解密用户信息.手机号需用到session_key也需要decode,以下是官方描述: 加密数据解密算法 接口如果涉及敏感数据(如wx.getUserInfo当中的 openId ...

  8. [BZOJ]最长道路

    题目   点这里看题目.    BZOJ 上是权限题目. 分析   这道题可以用点分治,但是我就是喜欢边分治 QAQ .   分治过程中,我们考虑经过分治边的路径的最大痛苦值.一条经过分治边的路径会被 ...

  9. JavaScript触发器

    感谢:链接(视频讲解很详细) JavaScript触发器 一.功能 顾名思义就是操控鼠标或键盘触发(实现)一些特定功能. 二.功能实现 <script type="text/javas ...

  10. Java 异常处理的十个建议

    前言 Java异常处理的十个建议,希望对大家有帮助~ 本文已上传github: https://github.com/whx123/JavaHome 公众号:捡田螺的小男孩 一.尽量不要使用e.pri ...