反射中,Class.forName和Classloader.loadclass的区别
加载,链接,初始化
forName可以选择初始化类static块和static变量,ClassLoader.loadClass(className)实际调用的是ClassLoader.loadClass(name, false),第二个参数指出Class是否被link。因此区别就是看程序是否依赖于Class是否被初始化,是就必须用Class.forName(name)了。典型例子就是jdbc的driver,需要在static块中注册到manager
异常
- 举例说明异常的结构,运行时异常和非运行时异常
- try-catch-finally-return的执行顺序
- return语句并不是函数的最终出口,如果有finally语句,这在return之后还会执行finally(return的值会暂存在栈里面,等待finally执行后再返回)
- finally里面不建议放return语句,根据需要,return语句可以放在try和catch里面和函数的最后。可行的做法有四: (1)return语句只在函数最后出现一次。
(2)return语句仅在try和catch里面都出现。
(3)return语句仅在try和函数的最后都出现。
(4)return语句仅在catch和函数的最后都出现。 注意,除此之外的其他做法都是不可行的,编译器会报错。
转自:http://qing0991.blog.51cto.com/1640542/1387200
JVM
- GC问题
- 两个相互引用的对象,会不会不被GC
- 由于现在jvm用的基本都是GC Roots 可达性算法分析对象的存货,因此不存在相互引用就不被回收的情形,只要可达就不GC,不可达就标记GC。
- 可作为GC root的有:1. 虚拟机栈中的引用对象、2. 方法区中的类静态属性引用的对象、3. 方法区常量引用的对象和本地方法栈中JNI的引用的对象。
- JAVA不建议使用finalize()(所谓的析构方法),就是因为如果此方法使用不当(大多数情况下确实如此)会影响GC的可达性判断,使得对象出现起死回生的现象而无法被回收(finalize中重新将对象与一个引用关联就可逃过GC)。