java面试题——对于多态你是怎么理解的呢?不一样的角度,带你重新看java
java面试的时候经常会被问到一个问题,那就是java三大特性:继承,封装和多态。那么这三者的含义究竟是什么你真的清楚吗?我看网上大多都是人云亦云。所以我想把我的想法记录下来供大家参考~今天先聊一个,多态是什么呢?
我们都知道,java程序是分为编译和运行两部分的,那你有没有想过,java的编译的期间是怎么判断你所写的方法是属于哪里的呢?没错,就是我们常说的绑定。绑定就是指把一个方法和方法的主体关联起来,对于java来说,绑定分为静态绑定和动态绑定。那这和我们的多态有什么关系呢!所谓的多态,就是指父类引用指向子类对象,这样调用的方法就是子类的实现而不是父类的实现,多态实现的核心就是我们上面说的动态绑定。这样说是不是有点迷?没事,往下看就知道了。
首先说一下静态绑定:java程序运行前就可以知道这个方法所属的主体,实际上也就是java程序编译期间的绑定,java中的方法只有用private,final,static和构造方法是静态绑定。那么我们来回忆一下这几个东西的特点:
private修饰的方法,不可以在子类当中被继承,所以自然也就和本类绑定到了一起。
final修饰的方法,可以被继承,但是不可以被覆盖(重写),所以子类调用的都是父类当中的这个final方法,所以我们也可以了解到final 的作用:一,防止方法被覆盖,二,有效的关闭动态绑定。
构造方法这个也不用多说,虽然网上有说继承这个类就默认继承了他的无参构造,但是我们都知道super关键字就是帮助子类调用父类的构造方法来实现初始化,而我们使用继承的方法则不需要那么做,所以编译器也可以看出这个方法的主体。
static修饰的方法,可以被继承,但是不可以被覆盖,但是可以被子类隐藏。继承自然是指这个方法可以继承父类的静态方法,但是不能够重写,如果子类中有相同的方法时,父类的方法被隐藏起来,为什么这么说呢?因为如果将子类转型向上为父类时,那么调用该方法时使用的是父类的方法,所以是被隐藏起来。
说完了静态绑定,我们说一下重要的动态绑定,那么如果一个方法在编译期间没办法判定方法的主体怎么办,那就需要我们的动态绑定,也就是运行期间的绑定。是如何实现的呢?不同的语言动态绑定的方法是不一样的,Java是什么样的呢?首先虚拟机提取对象实际类型的方法表,虚拟机查找方法签名,调用该方法。因此当虚拟机调用一个实例方法时,就会根据对象的实际的类型来选择相应的方法,这也就是我们所说的动态绑定。多态的实现方式,比如接口,重写或者抽象类和抽象方法都是基于这一个中心思想来实现的。
综上,大家可以思考一下,成员变量或者类变量采用的是什么绑定呢?有没有什么办法可以使得静态绑定变为动态绑定呢?
java面试题——对于多态你是怎么理解的呢?不一样的角度,带你重新看java的更多相关文章
- 带着新人看java虚拟机07(多线程篇)
这一篇说一下比较枯燥的东西,为什么说枯燥呢,因为我写这都感觉很无聊,无非就是几个阻塞线程的方法和唤醒线程的方法... 1.线程中断 首先我们说一说怎么使得一个正在运行中的线程进入阻塞状态,这也叫做线程 ...
- 带着新人看java虚拟机06(多线程篇)
其实多线程还有很多的东西要说,我们慢慢来,可能会有一些东西没说到,那就没办法了,只能说尽量吧! 1.synchronized关键字 说到多线程肯定离不开这个关键字,为什么呢?因为多线程之间虽然有各自的 ...
- 带着新人看java虚拟机04(多线程篇)
我记得最开始接触多进程,多线程这一块的时候我不是怎么理解,为什么要有多线程啊?多线程到底是个什么鬼啊?我一个程序好好的就可以运行为什么要用到多线程啊?反正我是十分费解,即使过了很长时间我还是不是很懂, ...
- 带着新人看java虚拟机03
分享一篇博客:https://blog.csdn.net/yfqnihao/article/details/8289363,本篇有部分参考这篇博客!!! 还是继续说一下java虚拟机,为什么呢?因为我 ...
- 带着新人看java虚拟机02
上一节是把大概的流程给过了一遍,但是还有很多地方没有说到,后续的慢慢会涉及到,敬请期待! 这次我们说说垃圾收集器,又名gc,顾名思义,就是收集垃圾的容器,那什么是垃圾呢?在我们这里指的就是堆中那些没人 ...
- 带着新人看java虚拟机01
1.前言(基于JDK1.7) 最近想把一些java基础的东西整理一下,但是又不知道从哪里开始!想了好久,还是从最基本的jvm开始吧!这一节就简单过一遍基础知识,后面慢慢深入... 水平有限,我自己也是 ...
- 带着新人看java虚拟机05(多线程篇)
上一篇我们主要是把一些基本概念给说了一下以及怎么简单的使用线程池,我们这一节就来看看线程池的实现: 1.线程池基本参数 以Executors.newFixedThreadPool()这种创建方式为例: ...
- 拼多多、饿了么、蚂蚁金服Java面试题大集合
自己当初找工作时参加过众多一线互联网公司的Java研发面试,这段时间处于寒冬,然而前几天跳槽找工作,两天面了3家,已经拿了两个offer,觉得可以和大家分享下: 下面为拼多多.饿了么.蚂蚁金服.哈啰出 ...
- 金三银四季来了!Java 面试题大放送,能答对70%就去BATJTMD试试~
摘要: 2019,相对往年我们会发现今年猎头电话少了,大部分企业年终奖缩水,加薪幅度也不如往年,选择好offer就要趁早,现在开始准备吧,刷一波Java面试题,能回答70%就去BATJTMD大胆试试~ ...
随机推荐
- 【Python源码剖析】对象模型概述
Python 是一门 面向对象 语言,实现了一个完整的面向对象体系,简洁而优雅. 与其他面向对象编程语言相比, Python 有自己独特的一面. 这让很多开发人员在学习 Python 时,多少有些无所 ...
- nginx功能介绍和基本安装
一.简介 nginx是一款自由的.开源的.高性能的HTTP服务器和反向代理服务器:同时也是一个IMAP.POP3.SMTP代理服务器:nginx可以作为一个HTTP服务器进行网站的发布处理,另外ngi ...
- LeetCode 76,一题教会你面试算法时的思考套路
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode专题的第45篇文章,我们一起来看看LeetCode的76题,最小窗口子串Minimum Window Substrin ...
- Flask 项目目录蓝图
Flask 项目目录蓝图 小型项目 大型项目 定义蓝图 注册蓝图 template_folder="XXX" 参数是指 模板文件夹 注意 优先是找templates 在找自己指定的 ...
- Hive中row_number()、dense_rank()、rank()的区别
摘要 本文对Hive中常用的三个排序函数row_number().dense_rank().rank()的特性进行类比和总结,并通过笔者亲自动手写的一个小实验,直观展现这三个函数的特点. 三个排序函数 ...
- ODEINT 求解常微分方程(2)
import numpy as np from scipy.integrate import odeint import matplotlib.pyplot as plt # function tha ...
- Ubuntu18.04 安装QQ、Tim、微信与win无差异
一.安装deepin-wine环境: 桌面下打开终端,依次输入以下命令 git clone https://gitee.com/wszqkzqk/deepin-wine-for-ubuntu.git ...
- .Net 对于PDF生成以及各种转换的操作
前段时间公司的产品,要做一个新功能,签章(就是把需要的数据整理成PDF很标准的文件,然后在盖上我们在服务器上面的章) 然后我就在百度上找了找,发现搞PDF的类库很少,要么就要钱,要么就有水印,破解版的 ...
- SpringBoot + Mybatis + Redis 整合入门项目
这篇文章我决定一改以往的风格,以幽默风趣的故事博文来介绍如何整合 SpringBoot.Mybatis.Redis. 很久很久以前,森林里有一只可爱的小青蛙,他迈着沉重的步伐走向了找工作的道路,结果发 ...
- selenium(6)-截取完整页面和指定元素并保存为图片
截图操作 截取整个页面 截取指定元素 只有这2个方法 比较简单,见下图代码 from selenium import webdriver driver = webdriver.Chrome(" ...