更新时间:2020-03-31 09:55:41 来源:极悦 浏览4233次
如今正是金三银四的好时机,企业招聘已经陆续开始了,小编在这关键时刻为你汇总Java面试题,有了小编的面试法宝让你参加Java面试更轻松。
什么情况下会触发类的初始化?
(1)、遇到 new, getstatic, putstatic, invokestatic 这4条字节码指令。
(2)、使用 java.lang.reflect 包的方法对类进行反射调用。
(3)、初始化一个类的时候,如果发现其父类还没有进行过初始化,则先初始化其父类(注意:
如果是接口的话,则不要求初始化父类)。
(4)、当虚拟机启动时,用户需要指定一个要执行的主类(包含 main()方法的那个类),虚拟机会先初始化这个主类。
(5)、当使用JDK 1.7 的动态语言支持时,如果一个 java.lang.invoke.MethodHandle 实例最后的解析结果 REF_getstatic, REF_putstatic, REF_invokeStatic的方法句柄,并且这个方法句柄所对应的类没有进行过初始化,则先触发其初始化。
外加几种不会初始化的例子:
(1)、同类子类引用父类的静态字段,不会导致子类初始化。至于是否会触发子类的加载和验证,则取决于虚拟机的具体实现。
(2)、通过数组定义来引用类,也不会触发类的初始化。例如下面这个语句:
1Animal[] a = new Animao[10];
并不会触发 Animal 类的初始化。
(3)、引用一个类的常量也不会触发初始化。
谈谈你对解析与分派的认识。
1.方法在程序真正运行之前就有一个可确定的调用版本,并且这个方法的调用版本在运行期间是不可变的,即“编译时可知,运行不可以变”,这类目标的方法的调用称之为解析。
Java 语言中符合“编译器可知,运行期不可变”这个要求的方法,主要包括静态方法和私有方法两大类。
2.解析调用一定是个静态的过程,在编译期就完全确定,在类加载的解析阶段就将涉及的符号引用全部转变为可以确定的直接引用,不会延迟到运行期再去完成。而分派(Dispatch)调用则可能是静态的也可能是动态的。于是分派方式就有静态分派和动态分派。
如何⾃定义⼀个类加载器?你使⽤过哪些或者你在什么场景下需要⼀个⾃定义的类加载器吗?
可以把自己自定义的类加载器继承 ClassLoader,然后重写 findClass() 方法,把自己的类加载逻辑写到 findClass() 方法中去。
使用类加载器的场景:
加载特定路径的 class 文件
热部署加载 class 文件
从网络中加载一个加密的 class 文件
java中 == 和equals() 和 hashCode() 的区别
(1)、== 是运算符,a == b 比较的是 a,b的数值是否相等。
(2)、equals 是 Object 类的一个方法,默认情况下比较两个对象是否是同一个对象,内部的实现是通过 == 来比较两个对象的内存地址是否相等,其源码如下
1 public boolean equals(Object obj) {2 return (this == obj);3 }
如果想比较两个对象的其他内容,则可以通过重写 equals方法,例如 String 类就重写了 equals 方法,改成了对象的内容是否相等。
(3)、hashCode 也是Object 类的一个方法,返回值是该对象的哈希码,同一个对象的哈希码一定相等,但不同对象的哈希码也是有可能相等的。
(4)、hashCode() 与 equals() 的关系:如果两个对象根据 equals() 方法比较相等,那么这两个对象的 hashCode() 返回值一定相等;如果两个对象根据 equals() 方法比较不相等,那么这两个对象的 hashCode() 返回值不一定不相等
int与integer的区别
int 是一个基本数值类型,Integer 是一个对象,Integer 是 int 的一个包装类型,两者可以通过拆箱和装箱自动转换。
拓展一下:
1Integer a, b;
对于 a == b,比较的是 a 与 b 是否是同一个对象,但是如果运算符 == 左右两边算术运算的话,则 a,b会自动拆箱成 int 类型来进行比较。
以上就是极悦java培训机构的小编针对“2020年Java面试题及答案汇总”的内容进行的回答,希望对大家有所帮助,如有疑问,请在线咨询,有专业老师随时为你服务。
0基础 0学费 15天面授
Java就业班有基础 直达就业
业余时间 高薪转行
Java在职加薪班工作1~3年,加薪神器
工作3~5年,晋升架构
提交申请后,顾问老师会电话与您沟通安排学习