一面
8/7 11:40 15分钟
自我介绍
能不能接受转Go语言?
有没有用过计算机网络编程,在java中有用到哪些网络编程(SpringBoot)
java里面的多态机制,涉及到JVM层面的
- Java多态包括两种,一种是方法重载,一种是方法重写,多态最典型的使用场景就是父类引用指向子类对象;
- 对于方法重载,其在JVM层面是利用静态分派,即利用实例对象的静态类型来确定方法执行版本时的分派动作,对于静态分派,javac编译器在编译期就可以根据参数的静态类型确定具体使用哪个重载版本;
// 这里需要说一下,静态类型和实际类型分别对应什么,一般静态类型是父类的class类型,而实际类型就是子类实例的class类型,例如 Human man = new Man(); Human woman = new Woman(); // 这里Human类型即静态类型,而Man和Woman则是其实际类型,在具体确定方法重载的时候执行的是哪个版本的重载方法,则是以实例对象得静态类型来确定的,反映在上面,则是会执行形参为Human类的重载方法,而不是Man和Woman。
对于方法重写,即子类对象或者接口实现类对象对父类(接口)方法的重写,具体要执行哪个方法,在编译期是没办法确定的,这时候Java虚拟机就需要根据实际类型的不同来分派方法的执行版本,那么它是如何实现的呢?
解决问题的关键还是在invokevirtual指令本身入手,该指令调用所有的虚方法,而java中除了静态方法、私有方法、构造方法、父类方法、被final修饰的方法外,其余的所有方法都是属于虚方法;
事实上,invokevirtual指令的运行时解析过程大致可以分为如下四步:
1) 找到操作数栈顶的第一个元素所指向的对象的实际类型,记为C(注意,在调用相关的方法之前,已经将多态实例通过aload指令将它们压到了栈顶)
2) 如果在类型C中找到与常量中的描述符和简单名称都相符的方法,则进行访问权限校验,如果通过则返回这个方法的直接引用,查找过程结束,不通过则返回java.lang.IllegalAccessError
3) 否则,按照继承关系从下向上依次对C 的各个父类进行第二步的查找和校验过程
4) 如果始终找不到合适的方法,则抛出java.lang.AbstractMethodError 异常;
我们把这种在运行时根据实际类型确定方法执行版本的分派过程称为动态分派
动态分派是一个执行非常繁琐的过程,所以在虚拟机里面对其进行了优化,最常见的优化方法是==为类型在方法区中创建一个虚方法表(vtable),与此对应的,在invokeinterface执行时也会用到接口方法表(itable)==,通过虚方法表索引来代替元数据查找以提升性能。
在虚方法表里面,如果子类未重写该方法,则子类的虚方法表中这个方法的地址入口和父类方法的相同,为父类实现的入口;当子类重写了这个方法的时候,子类虚方法表中这个方法的地址会替换为子类实现版本的入口地址。
虚方法表一般在类加载的连接阶段进行初始化,准备了类的变量的初始值后,虚拟机会把该类的虚方法表也一同初始化完毕。
- TCP的三次握手
- 常见的排序算法,说一个你了解的
- 多线程的创建方式
- 工作地点,为什么想在西安工作
- 反问:大概多久通知二面?(好像是说二面直接就是hr,这个面试过程,emm... 有点迷)
二面
8/13 15:40 20分钟
- 自我介绍
- 之前做过哪些项目,能不能和我讲一下
- 说一下你在项目中遇到的问题和解决方式都有哪些
- 说一下你的优缺点
- 你觉得你最大的闪光点或者说职业竞争力在哪里
- 我们有北京,上海,西安三个工作地点,你最意向的工作地点是哪一个?
- 主要的技术语言,以及之前学过和接触过哪些语言?
- (时间太久有点忘了,所以貌似没了?技术问题感觉没咋问,或者也就问了一两个?)
- 反问环节
总结:诺瓦科技的面试官还是挺好的,整体问的问题并不太难,现在也已经收到了该公司的意向书,并进行了相关的谈薪,主要纠结的就是该公司主营业务为LED显示屏相关的,硬件和嵌入式可能为主体,怕软开的部门重视度不高,后续发展受限,不知道有没有哪个小伙伴知道这个情况的,求评论,求指导
全部评论
(1) 回帖