1. 谈谈对Java平台的理解
Java是一种面向对象的语言,最显著的特征有两个,
一个是书写一次,到处运行(Write/Compile once,run anywhere)
通过这种方式,非常容易获得跨平台的能力;
PS:Java跨平台的特性,不是指由JVM编译字节码后,可以直接在各个平台运行,而是指在各个平台上安装好对应的JDK环境以后,可以在各个环境的JVM中运行。
另一个则是垃圾回收器(GC, Garbage Collector)
,通过垃圾回收器,程序员可以专注于代码的开发,而不用自己操心内存的分配与回收。
拓展:
类加载机制
常见的垃圾收集器(SerialGC、ParallelGC、CMS、G1)
垃圾收集器的原理
2. 什么是Java的解释执行?
Java语言有JVM虚拟机,首先是由Javac
指令,把Java
编译成字节码,和C++的编译执行不一样,C++是把C文件直接编译成机器码,而Java是先把Java文件编译成字节码,然后通过JVM(Java虚拟机)将字节码解释成机器码来运行,在.class文件中,存放的时字节码,Java通过字节码和JVM这种跨平台的抽象,屏蔽了操作系统和硬件直接的差异,这也是一次编译,到处运行的基础
当然,也有特殊点,大部分的JDK(Oracle的Hotspot)都会具备JIT
(just in time,动态编译器)来把热点字节码编译成机器码(编译执行),然后再运行,这样子可以大大提高热点代码的执行效率。所以Java语言算是混合执行(解释执行 + 编译执行)
拓展:
C1:client模式,适用于启动速度敏感的应用
C2:server模式,为长时间运行的服务器应用设计的,采用分层编译
3. Exception与Error的区别
它们都是继承于Throwable
类,只有Throwable
类型的实例,才能被throw和catch
-
Exception通常是程序正常运行过程中,预料之中的情况,它可以并且应该被捕获,然后进行对应的处理。Exception又分为检查时异常和运行时异常,
- 检查时异常:必须在程序中显式的捕获或抛出的异常,这是编译时检查的一部分。
- 运行时异常:运行过程中出现的异常,这种异常通常是可以编码避免的逻辑错误,具体要根据业务需求常见,来判定要不要捕获或抛出。
-
Error是指在正常情况下不大可能出现的情况,大部分的Error会导致程序异常,并处于不可恢复的状态。
4. final、finally、finalize有什么不同
-
final是用来修饰类、方法、变量的一个关键字,作用在类上时,意味着类不可被继承,作用在方法上时,意味着方法不可被重写,作用在变量上时,意味着变量的引用不可变。
-
finally是用来和异常捕获语句通用的,可以用try-finally,try-catch-finally,被finally包裹的代码块是一定会执行的,除了system.exit(1)的情况,通常用来释放资源、解除锁等操作。
-
finalize是object的一个方法,它的设计目的是保证对象被垃圾回收前,完成特定资源的回收。目前已经不推荐使用,从JDK9开始,被标记为deprecated