Java架构师-诺禾

第一个问题,Java是否允许多继承?
这种问题比较含糊,它是属于一道陷阱题,我们怎么来回答这个问题呢?Java中它是不允许这个类的多继承,允许接口的多继承,这个你该有疑问了,接口不是叫实现么?不应该叫继承,关键字不一样。
JVM是如何实现java7 try-with-resource特性?
首先你要知道什么是try-with-resource,try-with-resources 是 JDK 7 中一个新的异常处理机制,它能够很容易地关闭在 try-catch 语句块中使用的资源。所谓的资源(resource)是指在程序完成后,必须关闭的对象。try-with-resources 语句确保了每个资源在语句结束时关闭。所有实现了 java.lang.AutoCloseable 接口(其中,它包括实现了 java.io.Closeable 的所有对象),可以使用作为资源。

String s = “abc” 与 String s = new String(“abc”) 有什么区别?
一个存在栈中,而第二个存放在堆中,如果调用intern方法两者会不会相等?首先我们先看什么是intern方法。
关于字符串String中的intern方法,是当前的字符对象(通过new出来的对象)可以使用intern方法从常量池中获取,如果常量池中不存在该字符串,那么就新建一个这样的字符串放到常量池中。
使用常量池的方法一个是通过双引号定义字符串例如:String S = “1”;还有就是上面的intern方法。
public static void main(String[] args) {
String s1 = new String(“1”);
s1.intern();
String s2 = “1”;
System.out.println(s == s2);
String s3 = new String(“1”) + new String(“1”);
s3.intern();
String s4 = “11”;
System.out.println(s3 == s4);
}
在jdk1.6中返回false,false,jdk1.7是false,true
分析:
在JDK1.6下,StringPool在永久代,通过new关键字创建出来的有两个对象,一个在常量池,一个在堆中。
上图可以容易的看出两个s1与s2, s3与s4的地址是不一样的,所以都返回false
在JDK1.7下,由于String大量的使用导致永久代经常发生OutOfMemoryError,所以将StringPool搬到heap中。
判断这个常量是否存在于常量池。如果存在,判断存在内容是引用还是常量,如果是引用,返回引用地址指向堆空间对象,如果是常量,直接返回常量池常,如果不存在,将当前对象引用复制到常量池,并且返回的是当前对象的引用
Java中的finally是肯定会被执行的,但是如果其中的catch块中已经返回值,其是否会被执行?以及执行情况怎样?
返回的值在return后不会改变。
不会被执行的情况
finally的真正含义是指从try代码块出来才一定会执行相应的finally代码块。
没有进入try代码块,对应的finally自然也不会执行。
System.exit()
stem.exit()的作用是中止当前虚拟机,虚拟机都被中止了,finally代码块自然不会执行。
守护(daemon)线程被中止时
java线程分为两类,守护线程和非守护线程。当所有的非守护线程中止时,不论存不存在守护线程,虚拟机都会kill掉守护线程从而中止程序。 虚拟机中,执行main方法的线程就是一个非守护线程,垃圾回收则是另一个守护线程,main执行完,程序就中止了,而不管垃圾回收线程是否中止。 所以,如果守护线程中存在finally代码块,那么当所有的非守护线程中止时,守护线程被kill掉,其finally代码块是不会执行的。

©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页