31、String s = new String("xyz");创建了几个StringObject?是否可以继承String类?
类加载时遇到”abc”会创建一个String对象并放入常量池;程序执行时new String()又会在堆内存中创建一个,
总共两个StringObject;String是final修饰的类,所以不能被继承
32、String和StringBuffer的区别
String:字符串,长度不可变,不能被继承,字符串拼接时,会产生临时字符串对象,效率低
StringBuffer:可变字符序列,字符串拼接时,不会产出临时字符串对象,效率高,可用于大量字符的拼接
33、下面这条语句一共创建了多少个对象:String s="a"+"b"+"c"+"d";
javac编译可以对字符串常量直接相加的表达式进行优化,不必要等到运行期去进行加法运算处理,而是在编译时
去掉其中的加号,直接将其编译成一个这些常量相连的结果。
题目中的代码被编译器在编译时优化后,相当于直接定义了一个”abcd”的字符串
34、try {}里有一个return语句,那么紧跟在这个try后的finally{}里的code会不会被执行,什么时候被执行,
在return前还是后?
try{}中的return执行后在没有返回数据时先去执行finally{}中的代码,然后再返回,所以会在return中间执
行。
35、final, finally, finalize的区别。
final:修饰类时,不能被继承,修饰方法时不能被重写,修饰变量时只能赋值一次
finally:与try-catch配合使用进行捕获异常,finally中的代码为始终要执行的代码
finalize:Object类的一个方法,当垃圾回收器确定没有变量指向的对象时,会调用该对象的finalize方法进行
资源回收
36、运行时异常与一般异常有何异同?
对于运行时异常,Java编译器不要求必须进行异常捕获处理或者抛出声明,由程序员自行决定
一般异常,Java编译器强制程序员必须进行捕获处理,如果不进行捕获或者抛出声明处理,编译不会通过
37、error和exception有什么区别?
都继承了Throwable类
error指恢复不是不可能但非常困难的情况下的一种严重错误,比如内存溢出,不指望程序可以处理这样的情况
exception表示一种设计或者实现问题,如果程序正常运行,则不会发生。又分为运行时异常和非运行时异常
38、简单说说Java中的异常处理机制的简单原理和应用。
当Java程序违反了Java的语义规则时,JVM就会将发生的错误表示为一个异常。违反语义规则包括2中情况。一种
是Java类库内置的语义检查。例如数组下标越界,会抛出IndexOutOfBoundsException;访问null的对象时会抛
出NullPointerException.另一种情况就是Java允许程序员扩展这种语义检查,程序员可以创建自己的异常,并
自由选择在何时用throw关键字抛出异常。所有的异常都是java.lang.Throwable的子类
39、Java 中堆和栈有什么区别?
堆和栈都是Java用来存放数据的地方
Java的堆是一个运行时数据区,类的对象从堆中分配空间。这些对象通过new等指令建立,通过垃圾回收器来销
毁;
堆的优势是可以动态的分配内存空间,需要多少内存空间不必事先告诉编译器,因为它是在运行时动态分配的。
但缺点是,由于需要在运行时动态分配内存,所以存取速度较慢
栈中主要存放一些基本数据类型的变量和对象的引用;
栈的优势是,存取速度比堆快,栈数据可以共享。但缺点是,存放在栈中的数据占用多少内存空间需要在编译时
确定下来,缺乏灵活性
40、能将 int 强制转换为 byte 类型的变量吗?如果该值大于 byte 类型的范围,将会出现什么现象?
是的,我们可以做强制转换,但是Java中int是32位的,而byte是8位的,所以,如果强制转换时,int类型的高
24位将会被丢弃,byte类型的范围是从-128到127
上一篇: Java常用面试题之Java集合框架篇(三)
下一篇: Java常用面试题之Java基础篇(五)