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实现 LeetCode 116 填充每个节点的下一个右侧节点指针

    116. 填充每个节点的下一个右侧节点指针 给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点.二叉树定义如下: struct Node { int val; Node *left ...

  2. Java实现第八届蓝桥杯最大公共子串

    最大公共子串 最大公共子串长度问题就是: 求两个串的所有子串中能够匹配上的最大长度是多少. 比如:"abcdkkk" 和 "baabcdadabc", 可以找到 ...

  3. Python学习之计算机基础

    计算机基础: (1)计算机俗称电脑,是现代用于高速计算的电子计算器,可以进行数值计算也可以进行逻辑计算,还有存储记忆功能.是能够按照程序运行,自动,高速处理海量数据的现代化智能 电子设备. (2)物理 ...

  4. GitHub 热点速览 Vol.23:前后端最佳实践

    作者:HelloGitHub-小鱼干 摘要:最佳实践,又名 best-practices,是 GitHub 常见的项目名,也是本周 Trending 关键词.25 年 Python 开发经验的 Dav ...

  5. 快速升级Zabbix 5.0 版本

    Zabbix 5.0 增加了很多新功能,如:垂直菜单.隐藏菜单.用户界面中的测试项目.限制代理检查.查找并替换预处理步骤 ES7支持等等...快来部署体验一把尝鲜体验 Zabbix 5.0 吧     ...

  6. HDU - 2639 Bone Collector II 题解

    题目大意 一个人收藏骨头,有 n 个骨头,每个骨头有体积和价值,问能够装在容量为 V 的背包中,能获得的第 k 大(去重后)价值是多少. 样例 样例输入 1 5 10 2 1 2 3 4 5 5 4 ...

  7. 浅谈Unity的脚本执行顺序

    一.添加脚本的顺序 这是一张官方的脚本顺序图 一般,当我们把脚本绑定在游戏对象上时,或者点击绑定好的脚本的reset按钮时,会调用Reset() 当我们初始化一个对象时,会先调用Awake()在调用O ...

  8. 手把手教你学Numpy,这些api不容错过

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Numpy专题的第5篇文章,我们来继续学习Numpy当中一些常用的数学和统计函数. 基本统计方法 在日常的工作当中,我们经常需要通过一 ...

  9. 动手造轮子:实现一个简单的 AOP 框架

    动手造轮子:实现一个简单的 AOP 框架 Intro 最近实现了一个 AOP 框架 -- FluentAspects,API 基本稳定了,写篇文章分享一下这个 AOP 框架的设计. 整体设计 概览 I ...

  10. 有关 HashMap 面试会问的一切

    前言 HashMap 是无论在工作还是面试中都非常常见常考的数据结构. 比如 Leetcode 第一题 Two Sum 的某种变种的最优解就是需要用到 HashMap 的,高频考题 LRU Cache ...