目录
补充:面试未通过
一轮 电话面试
2019.04.28 16:21
[w]:面试官,[m]:我,下面的内容来自电话录音。
[m]:喂,喂
[w]:喂你好,请问是xxx同学吗?
[m]:对,是的;
[w]:你好,我这边是上海爱奇艺,之前和你约好下午有电话面试,你现在那边OK吗?
[m]:可以啊
[w]:你那边信号好吗?听我说话听的清楚吗?
[m]:听得清楚呀,你那边听得清楚我说的吗?
[w]:嗯,我这边听得清楚
[w]:行,那我们就开始;
[w]:我先问一下,你现在人在哪个城市啊?
[m]:在苏州呀
[w]:苏州,就是中科大苏州这边软院是吧;
[m]:对
[w]:嗯好的,你平时开发的主语言是Java吗?
[m]:对啊,是Java;
[w]:好的,那我主要是问一下Java相关的一些基础知识
[m]:哦,行
[w]:Java有个最基本的类Object,这个类默认包含哪几个方法?
[m]:wait,notify,notifyAll,finalize,toString,hashCode,equals;
[w]:还能想到其他的吗?
[m]:没有了啊,想不到了;
记:还有:clone、getClass;
[w]:好,那我再换一个东西问,Java里面,你日常写代码中遇到过哪些Exception,能举一些例子出来吗?
[m]:空指针、角标越界,Emmm...能想到的是这两个
[w]:还能想到其他的吗?
[m]:其他的,在写测试的时候会用到那个什么...Interr...就是打断的异常,Intercept异常。(其实是InterruptedException)
记:面试官主要是想看你遇到哪些异常,然后来推断你的实践范围和能力。
[w]:好,我问一下Java里面有那个==,它和Java的equals方法有什么区别?
[m]:等号(==)就是看一下那两个对象(引用)是否指向同一个内存空间,就真的是相等;equals的话,那个Object里面equals()默认的话就是用==,所以你可以覆写的话,就可以自己去定义一下是否相等;
[w]:能说一下有没有什么很经典的场景,或者很经典的类是覆写了这个方法吗?
[m]:String类;
这块答得还阔以;
[w]:好,问一下Java创建线程有哪几种方法?
[m]:可以写一个类去继承Thread那个类,然后....(我还没说完)
[w]:嗯,还有其他的吗?
[m]:还有直接写个Runnable类(子类),传到Thread的构造函数里面;
[w]:还有其他的吗?
[m]:还有一个是Callable,就是实现这个接口,用Callable....(还是没说完)
[w]:那个Callable和Runnable有什么区别?
[m]:Callable它有个返回值,返回一个Future,然后...(再次没说完)
[w]:问一下,如果我们创建了这个线程,我想执行这个线程中的具体逻辑,我可以调用这个线程的start()方法去执行它,也可以调用这个线程的.run()方法去执行它,这两种执行方式有什么区别吗?
[m]:.run()的话就是不开启线程,就是直接调用个方法,.start()方法就是开启个线程吧;
[w]:好,问一下Java线程中的sleep方法和wait方法有什么区别?
[m]:sleep的话就是睡了,它不会释放锁,wait的话就是先要获得那个锁,才能释放;
[w]:处于wait状态的线程要用什么命令去唤醒它?
[m]:用notify,notifyAll;
[w]:notify和notifyAll有什么区别?
[m]:notify就是唤醒其中一个吧,notifyAll的话就是唤醒等待这个锁的所有线程;
[w]:如果现在有很多个线程在等待中,你不调用notifyAll(),而是调用notify(),会唤醒哪一个?
[m]:是唤醒随机一个吧(其实我也不太确定);
这块答得马马虎虎,有一些问题不太确定;
[w]:我再问一下,Java里面的多态相关的概念,多态里面有两个经典概念,一个叫重载,一个叫重写,能说一下这两个有什么区别吗?
[m]:重载的话,你可以不用涉及到什么父类之类的,定义一个方法的唯一标识就是方法名称、参数类型、参数个数,方法名称相同,参数类型,参数个数,这两个不同的话,那就是重载;
[w]:嗯,重写呢?
[m]:重写的话,就是要和父类相关,方法名称要相同,参数类型、参数个数要相同,可以把父类的方法覆写,实现自己的方法;
[w]:我问一个场景:你在子类中写了一个方法,它和父类的那个方法,方法名字是一模一样的,参数的类型和参数的个数列表也都一模一样,唯独返回类型不同,这样你调用这个子类方法,会返回哪一个?
[m]:返回类型不同的是吧,就调用子类的呀;哦,不对,这个它也实现了嘛,重写,因为标识就是方法名称、参数个数、参数类型都相同的话,调的应该就是子类的;(其实我感觉这里是有问题的,但是不太确定)
[w]:我问一下,如果是在同一个类里,你写了两个方法,方法名一模一样,参数列表一模一样,唯独返回类型不同,调用的时候会执行哪一个?
[m]:这可以吗?
[w]:这个不可以在哪里?
[m]:这个东西就是....它,如果你定义返回类型,哦...返回类型....(有点不自信)不好意思,刚才突然打断了,就是两个方法同名是吗...(面试官get到我的疑惑了)
[w]:对,就是在同一个类里,你写了两个方法,方法名一模一样,参数列表一模一样,唯独返回类型不同;
[m]:返回类型不同,然后咧?然后调用哪个???然后就没有了吗?但我觉得这个就,我没见过这样写的,而且感觉定义会有问题啊,返回类型不同定义会有错误,编译会有问题;
[w]:如果这种编译会错误,那么前面那种编译为什么不会错误?
[m]:对喔,前面那个也会有问题哦...
[w]:行,这块你回去再理解一下,或者你再查查资料,但是还可以;
这块答得不行,就是对知识点理解的不充分,所以才不自信;
[w]:我接着问一下Java 的垃圾回收你有多少了解?
[m]:GC是吧,就是....额....也不是很深,但稍微了解过,看过那本《深入理解JVM虚拟机》
[w]:我这么问吧,Java如果我们想要了解它虚拟机的话,常常会在JVM虚拟机中设置一些参数,比如说:Xmx,Xms,这些参数有见过吗?了解它什么含义吗?
[m]:就是指定那个堆空间大小吧,-Xms、-Xmx,就是指定堆空间的大小,会有限制,最大或最小;
记:
- 其实GC这部分我还是了解过一些的,比如GC分代、回收算法、标记算法,但是我确实不敢说我了解的有多深;
- 对于Xms和Xmx的回答,我可能答错了,所以面试官直接跳到下一个模块来问;
[w]:嗯,行,我问一下那个Linux你了解吗,我看到你简历有写:你有Linux基本的使用技能;我问一些Linux的基础命令;
[m]:呵....你问吧
[w]:在Linux命令中,重命名一个文件用什么命令?
[m]:move,mv
[w]:如果在Linux里面,想要找到这台机器上的所有tomcat进程,要用什么命令?
[m]:tomcat进程是吧,ps -aux | grep tomcat
这块还可以吧;
[w]:嗯,好,问一下一些基础的....你们有没有学数据结构和算法相关的东西?
[m]:学了一些;
[w]:嗯,那个排序算法里面有一个比较经典的概念,就是叫做“稳定性”吧,我们经常说有些排序算法是稳定的,有些是非稳定的,这个稳定指的是什么意思,知道吗?
[m]:知道呀,比如说有原始数据,1,1,就是两个1嘛,一个是在角标1,一个是在角标2,排序过程中,如果是稳定性算法的话,这两个数字的相对位置是不会发现变化的,不稳定的话....(还没说完)
[w]:这样,我接着这个问,哪些是稳定的排序算法?
[m]:稳定的算法,冒泡吧,插入排序,Emmm....想一想,现在想到的是这两个;
[w]:嗯,行,就这个里面我再抽一个追问一下,刚刚你提到了冒泡排序,你现在能回忆一下冒泡排序的过程,我问这么一个问题,如果需要我们把冒泡排序改造成非稳定的,要怎么改?
[m]:改造成非稳定的,就是它会跟前面一个元素比较嘛,如果相等的话就把那个位置给换一下;
这块还阔以吧;
[w]:嗯,好的,OK,你们这边的情况我基本了解,我再问一下其他的一些情况,就是你期末考试是到什么时候啊?如果你能够过来实习的话,你是什么时候才能开始实习?
[m]:7月10多号结束吧,我们这边校历上是这样写的;
[w]:7月多少号?
[m]:这个我具体时间我记不清楚了,应该就是7月10几号,我现在就可以看一下;
[w]:7月10几号....
[m]:对,实习的话就是我结束之后,考完试后我就可以去;
[w]:嗯,大概可以实习多久呢?
[m]:大概的话,就是....(还没说完)
[w]:可以实习到明年这个时候吗?
[m]:可以呀,但是我想先问一下,就是那边实习的话,工作内容是否可以写论文,就是我们这边实习需要写论文;
[w]:额,放心,这边都是这个样子的,我把我这边的情况先给你介绍一下好吧;
[w]:我们这边其实大量是你们中科大的学长在这边实习,一般就是在自己的工作岗位上,用开发的内容就顺便把论文一起写了,一代一代都是这样子(说到这里,我噗笑了一下)。就是苏州中科大软院我们这边非常熟,你们的每一代学长都在我们这边有大量的同学,所以你看到的贴子应该是由内网,或者由内部院里发出来的对吧;
[m]:我看到的贴子是我同学在群里转发的;
[w]:哦(面试官笑了下),好吧,反正就是说是一代代学长们....你们的学长们都是在这边写毕业论文的,毕设的这个问题不是问题。所有同学到来年3月份,你开题的时候,我们都会给你题目,基本上就是跟你工作相关的内容,然后就是可以....比较放心吧。毕设的这个事情不用太担心。
[m]:嗯;
[w]:嗯,行,我觉得基本上,电话这轮应该是过了。之后的话,HR还会和你约一个面试,我想一下,你在苏州,其实是这样子,还是有一轮代码的面试,代码面试就比电话里复杂一点,会出一两个代码题让你写。尽可能是...因为,其实从你从苏州中科大来公司其实也很近,OK的话就约一个现场面试吧,到时候我通知HR。我具体说一下,其实你从苏州学校到爱奇艺这边来大概两个小时左右,因为那苏州高铁站不是坐20块钱的动车坐到上海虹桥火车站,爱奇艺就在上海虹桥火车站旁边,那这样的话你觉得OK的话,我就找HR约一下现场的面试,看你哪天有空你就来一下我们这边。
[m]:也行;
[w]:嗯,可以吧,那就,那就,具体时间,到时候可能在51之后的那一周吧,看你哪一天有空都行,随便抽一个下午过来,到了这边现场的话应该需要2~3个小时,就是方便的话,最好在下午的2点钟,或3点钟来,你晚上还能做个高铁回去。这样OK吗?
[m]:噢...噢...可以可以
[w]:行,好的,那我就跟你约一个下周的现场面试,到时候你可以做点准备。但是其实就和网上差不多,无非就是纸上写代码,这样子的,看一下你实际的代码本领;好的,OK,那这样,电话面试就到这边了。嗯,额....你对我们这边有什么问题想问的吗?
[m]:我想问...(话还没说完)
[w]:或者你可以到现场来,我们在现场聊也一样的(面试官也笑了),到这边,到爱奇艺公司来看一看,然后上海爱奇艺里你们很近。你们往年有很多学长都在我们这边。好的,那就这样,那今天电话就到这边;
[m]:嗯,好好...谢谢
[w]:嗯,好,OK,拜拜
[m]:拜拜
二轮 代码笔试
2019.05.07 14:00
写代码这一轮,是我到上海爱奇艺创新大厦现场进行的。面试官拿几张白纸过来,然后现场给你想个题目,在纸上画一画,把题目给你说明白,下面就是你自己开始手写代码了。时间应该是1h,如果你在1h内解题数<=1,可能就不及格了。如果你能力很强,那当然是做出的题越多越好,面试官也是按难度:低->高的模式给你出题的。
解答我就不贴出来了,网上一查挺多的。(解题不是只写个思路就OK,一般是要写个函数,或者难一点的话要写个类,要求你的代码是可执行的,导包那些可能不用写)
题目一 String转double
给你一个String,内容类似:“3.14159”、“-1294.28842”,不用进行特殊的判断,比如:小数点存不存在,整数部分存不存在等,让你把这个String转换为double类型。(不能调用现有的转换函数哦!)
我当时写的解题思路是:整数部分乘10累加,小数部分除以10累加;
题目二 二叉树蛇形打印
输出:a b c g f e d 1 2 3 4 5 6 7 8
我当时写的解题思路是:一层队列一层栈;
做完题目1、2,应该还剩20分钟左右,面试官有点犹豫,一开始说:那我们继续做个题吧,后面又说:那我们还是看一下简历吧。然后花了几分钟问了我些简历上的基本情况,后面可能他自己想“这部分内容也不是我负责的啊”,然后就给我出了第三个题目。
题目三 动态规划
数字1对应字母a,2对应字母b....26对应z,我们给你一个字母组成的字符串“abc”,你可以转为“123”。现在是要给你一个数字组成的字符串“123”,让你求出有多少种可转成的字符串。比如:
- 123:1-a、2-b、3-c,最后可转为:abc
- 123:12-l(小写字母L)、3-c,最后可转为:lc
- 123:1-a、23-w,最后可转为:aw
- 所以总共有3种可转换成的字符串;
这个题我没写出来,一开始想分治,后来觉得不对,应该用动态规划。后来时间到了,他说没事,你回去看一下《算法导论》的动态规划。
2020.02.21 更新,最近刷 LeetCode 刷到了原题,传送门:https://leetcode.com/problems/decode-ways/,写了下题解:https://leetcode.com/problems/decode-ways/discuss/515060/Java-1ms-O(N)-96.79
回到目录
三轮 技术面试
2019.05.07 15:00
这轮面试我感觉自己完全被吊打,前面打小怪感觉良好,后面被Boss反杀。由于是现场面试,就没录音,只是根据印象记了些内容,现在整理出来。依旧是[w]:面试官,[m]:我。
[w]:刚才做了什么题目呢?
[m]:一个字符串转double的,还有一个二叉树蛇形打印的,还有个动态规划的,动态规划那个题没做出来。
[w]:嗯,你平常用的是Java是吧?
[m]:对
[w]:(面试官递给我简历)来,挑一个你熟悉的讲一下吧
[m]:(我挑了研一上学期的J2EE课设作业:SimpleController)
[w]:你这个项目是做什么的?
[m]:(我吧啦吧啦半天好像也没讲明白,一方面表达能力不行,另一方面我不清楚要基于什么样的粒度去讲解)
[w]:你从这个项目中学到了什么?
[m]:反射机制...(我本来想说反射和动态代理的,但我刚说完反射机制就被[w]打断了,后来想想,我觉得还是应该把话说完的)
[w]:那你怎么理解反射机制的呢?
[m]:一般调用对象方法都是用个对象,打点,然后调用的嘛,而反射机制缺可以通过类名、方法名等拿到一个方法调用的句柄,然后通过这个句柄来间接调用方法。(其实我这里写的还是我整理过的话语,现场我说的可能比这个乱一些)
[m]:(然后我很作死的补充道)有时候使用反射机制去调用对象的私有方法,可能会存在安全性问题。
[w]:你说反射调用一个对象的私有方法,会有安全性问题对吧,那你怎么解决这个问题呢?
[m]:(我一脸懵逼,后悔不该乱BB的,然后我开始基于事实的乱编),可以通过在对象中设置校验位来避免。
[w]:校验位???(面试官脑袋3个问号)
[m]:一个对象的状态是由它的属性来表示的嘛,如果通过反射机制来调用对象私有方法,可能会让对象转为不确定的状态(即:按理不应该出现的状态),那这时候在对象中设置一个校验位,在方法调用前都会检测这个校验位,如果校验失败则方法调用失败。也就是直接调用私有方法会让校验位变成“无法通过校验的值”。可以类比List集合迭代器的过程,如果在遍历的过程中删除元素,就会报错,这里面就是通过一个modCount校验位来实现的。(我当时的回答没这么清晰,大概思路就这样)
[w]:哦(我也不知道他听懂没,然后直接跳到下一个话题了)
[w]:常用的设计模式熟悉吗?
[m]:我知道一些,比如:单例、工厂...(我话还没说完)
[w]:单例,你怎么理解单例的?
[m]:有时候一个类并不需要创建多个对象,其创建一个对象就可以向外提供服务,如果创建多个对象,就会造成内存空间的浪费,所以使用了单例模式来控制对象的创建,保证一个类只有一个实例对象。
[w]:你能写出单例模式吗?
[m]:可以。(然后我写了第一个版本的:使用静态内部类来实现)
[w]:你这个编译有问题啊。(后来我看了下,确实有问题,但当时有点慌,就没注意到)
[w]:你为什么使用静态内部类来实现呢?
[m]:可以延迟加载
[w]:什么时候会被加载呢?
[m]:当调用那个静态方法的时候,会加载那个静态内部类,然后开始加载。
[w]:静态内部类你不会写,那你能写出其他实现方法吗?
[m]:可以。(然后我写了第二个版本:volatile+双重检测)
[w]:你能给我讲一下为什么要用双重检测吗?
[m]:(我讲了开头,然后中途不知道脑子怎么想的,突然觉得我写的是不是哪里有问题。其实我写的是对的,而且我也确实知道为什么那样写。只是当时要给面试官讲的时候,逻辑是: 如果这样子写,那就会有问题,但是我拿的是正确的代码来讲的,讲到途中突然发现没有出现预想的那个问题,所以突然脑子中断了一下,就一直没回过来。后来想想,自己好搞笑。)
[w]:代码写的出来,却不知道为什么?(他心里肯定在想,这小伙子肯定是为了应付面试,去背了代码。orz...我没有)
[m]:呵呵...
[w]:你觉得你的优势是什么?
[m]:我觉得我学习能力还是比较强的。
[w]:你能举个例子说明一下吗?
[m]:(这个问题我之前从没准备过,也是现场就编,但也是事实),我们上学期课程高级数据库有个大作业,要做一个完整的Web项目,旅游预订系统。我之前没怎么写过前端,然后各种查资料看前端内容,包括:bootstrap、Vue等,然后开始写代码,最后花了5天时间把这个大作业完成了。虽然这个网站做的不是那么完美,但我这5天看官方文档、菜鸟教程,基本都是full time写项目,算是挑战了自我吧,在这之前我没想过自己可以完成。
[w]:5天完成是吗?只做了前端吗?
[m]:不是,是全部,包括后端、数据库这些。
[w]:那你觉得你的缺点是什么?
[m]:我可能英语要差一些,相对于其他同学。然后表达可能会弱一些,就是脑子里面想得表达出来时不清晰。还有有点偏内向,不太善于社交。
(中间好像还问了什么,没印象了)
[w]:好吧,现在来看这么一个题:4x4的方格里,最左下角有一个点A,最右上角有一个点B,规定只有两种操作:往上移1步,或往右移1步,(注:不会往回走),问:从点A到点B有多少种走法?
(我想了想)
[w]:有思路吗?
[m]:将右移定位1,上移定为0,那就是取4个1和4个0的排列组合...(我话还没说完)
[w]:答案是多少?有多少种?
[m]:(我呵呵...)暂时没想出来。(后来吃饭时候和同学讨论,他说是
,不过我当时想的是
,所以需要去重,而怎么去重我一时间没想到,所以只能老老实实说没想出来)
[w]:如果让你用算法实现,你怎么做呢?
[m]:(我想都没想)做一个深度优先遍历吧。
[w]:你能用动态规划的方法来做吗?
[m]:(又是动态规划,之前没怎么刷过这方面的题,扑街)Emmmm,就是定义一个3维数组,g[u][v][?],然后起点(0,0)到其中一个点(0,k),然后再从k开始到终点,计算出这两个子部分的值,然后把它们相乘。
[w]:什么?3维数组?为什么是3维吗?我有点没清楚,你说的(u,v)是啥意思?
(然后我又讲了下,也没讲清楚)
[w]:你现在是有个比较清晰的解题思路呢,还是只是有个模糊的解答过程?
[m]:比较模糊吧,我是想定义(u,v),表示节点u到节点v的路径总数,但是这个节点又是个2维的。
[w]:那你要定义个4维的吗?(面试官好像笑了下)
[m]:Emmmm,应该不会那么麻烦的,应该有更简单的解题思路。
[w]:你动态规划方面的题是不是做的不多,我看你简历上有些刷题的,有leetcode啊。
[m]:对,我动态规划这部分练的比较少。
[w]:好吧,那我们再来看下一个场景:N维向量,稀疏矩阵,这个稀疏矩阵中绝大多数是0值,只有很少一部分是非0值。假设有1亿维,如何设计一个类去表示这个稀疏矩阵,并且要提供其与另外一个稀疏矩阵相加的操作。
[m]:(这就是涉及大数据的知识了,我的盲区,我想了想,然后说)要压缩数据,建立一个小一点的数组,去记录稀疏矩阵中一个非0数后面有多少个0...
[w]:你写一写吧,可以写在白板上。
(我随便写了下内部的数据结构,然后他就过来看了。我大概跟他讲了一下思路,其实我挺迷的。一开始想到的是在源串上直接压缩数据,就是1个非0数字后面跟上一个0,0后面有个count值,表示这个非0数字后面0出现的次数,如果非0数字后面直接就是非0值,表示其后面没有0。这种压缩方法虽然可以解压缩,但是一时间没想到怎么提供加法操作,所以就用了额外的数组来保存count,然后还对原串进行分片....)
[w]:好吧,我大概懂你的思路。(我自己也没懂,我不知道他怎么懂的😂)
[w]:你有什么问题想要问我吗?
[m]:如果我能在爱奇艺工作了,我要做什么内容呢?
(然后他给我讲了讲他们做的内容)
[m]:能举个具体点的例子吗?
(他又跟我说了一会,什么客户方写了个spark,打包,交给我们的基础平台运行。)
[m]:这个架构是什么样子的?能给我讲讲吗?或者画个图?
[w]:画图就先不画了,其实网上很多类似的架构,只是每个公司的细节可能不太一样。
[m]:嗯嗯,好的。
[w]:好吧,那就先面到这里,等我们有消息了再通知你。
[m]:好的。
[w]:我送你下去吧。
[m]:嗯,谢谢。
回到目录
总结
参考:科软-实习招聘-笔试面试感悟(2019.03.24~2019.05.12)
附:电话面试问题点解惑
针对电话面试中我不清楚的问题进行回顾。
1 Java有个最基本的类Object,这个类默认包含哪几个方法?
toString()、equals()、hashCode()、clone()、finalize()、wait()(wait方法有3个重载)、notify()、notifyAll()、getClass();
其实 Object 中还有个静态的私有本地方法:registerNatives();定义如下:
1 private static native void registerNatives();
2 static {
3 registerNatives();
4 }
关于 registerNatives() 方法,我查了一些资料,是和 JNI(Java Native Interface)有关,先记录一下查到的资料,后期需要时再深入理解。
相关资料:
2 不调用notifyAll(),而是调用notify(),会唤醒哪一个线程?
notify() API 中有这么一段话:
Wakes up a single thread that is waiting on this object's monitor. If any threads are waiting on this object, one of them is chosen to be awakened. The choice is arbitrary and occurs at the discretion of the implementation. A thread waits on an object's monitor by calling one of the wait methods.
译文:
唤醒正在此对象监视器上等待的单个线程。如果有任何线程正在等待这个对象,则选择其中一个线程被唤醒。选择是任意的,由实现决定。线程通过调用一个等待方法来等待对象的监视器。
3 重载和重写相关问题
3.1 Java 多态里面有两个经典概念,一个叫重载,一个叫重写,能说一下这两个有什么区别吗?
何为参数列表?
- 参数列表就是一个有序序列,序列的项就是参数类型;
- 比如:void foo(String name, int age, float salary) 这个方法,其参数列表就是[String, int, float],共有3个参数;
参考:《Java程序员面试笔试宝典》4.2.7 重载和覆盖有什么区别?
重载,是在一个类中多态性的一种表现,是指在一个类中定义了多个方法,这些方法的方法名都相同,参数列表都不同;
在使用重载时,需要注意以下几点:
- 1)不能通过方法的访问权限、返回值类型和抛出的异常类型来进行重载;
- 2)对于继承来说,如果基类方法的访问权限为 private,那么就不能在派生类对其重载;如果派生类也定义了一个同名的函数,这只是一个新的方法,不会达到重载的效果;
- 3)对于静态方法,有重载的概念;
重写,是指子类重写父类函数。在重写时需要注意以下几点:
- 1)子类中的重写方法必须要和基类中被重写方法有相同的函数名称和参数列表;
- 2)子类方法的访问权限必须大于等于父类方法;
- 3)子类方法的返回类型必须是父类方法返回类型或为其子类型;
- 4)子类方法抛出的异常类型必须是父类抛出异常类型或为其子类型;
- 5)对于静态方法,并没有重写的概念;
重载和重写的区别主要有以下几个方面:
- 1)重写是子类和父类之间的关系,是垂直关系;重载是同一个类中方法之间的关系,是水平关系;
- 2)重写只能由一个方法或只能由一对方法产生关系;重载是多个方法之间的关系;
- 3)重写要求参数列表相同;重载要求参数列表不同;
- 4)重写关系中,调用方法是根据对象的类型(对象对应存储空间类型)来决定;而重载关系是根据调用时的实参表与形参表来选择方法体的;(在JVM层面理解,重载是静态分派过程,重写是动态分派过程)
其他参考资料:
3.2 在子类中写了一个方法,它和父类的那个方法,方法名字是一模一样的,参数的类型和参数的个数列表也都一样,唯独返回类型不同,这样你调用这个子类方法,会返回哪一个?
代码:
1 public class Father {
2 public void foo(String s, int i) {
3 System.out.println("Father: " + s + ", " + i);
4 }
5 }
6
7 public class Son extends Father {
8 public int foo(String s, int i) {
9 System.out.println("Son: " + s + ", " + i);
10 return 0;
11 }
12 }
编译错误:
3.3 如果是在同一个类里,你写了两个方法,方法名一模一样,参数列表一模一样,唯独返回类型不同,调用的时候会执行哪一个?
代码:
1 public class Son {
2 public int foo(String name, int age) {
3 System.out.println("Son, name = " + name + ", age = " + age);
4 return 0;
5 }
6
7 public void foo(String name, int age) {
8 System.out.println("Son, name = " + name + ", age = " + age);
9 }
10 }
编译错误:
4 有哪些排序算法是稳定的?
我当时答的是:直接插入排序、冒泡排序;
除此外还有:归并排序、基数排序、计数排序,还是因为不常用的原因,所以印象不深刻;
归并排序:
转载请说明出处!have a good time :-)