java核心技术36讲笔记 一 Java平台的理解
谈谈你对Java平台的理解? “Java是解释执行”,这句话正确吗?
Java本身是一种面向对象的语言,最显著的特性有两个方面,一是所谓的“书写一次,到处运行”(Write once, run anywhere),能够非常容易地获得跨平台能力;
另外就是垃圾收
集(GC, Garbage Collection), Java通过垃圾收集器(Garbage Collector)回收分配内存,大部分情况下,程序员不需要自己操心内存的分配和回收。
我们日常会接触到JRE(Java Runtime Environment)或者JDK(Java Development Kit)。 JRE,也就是Java运行环境,包含了JVM和Java类库,以及一些模块等。
而JDK可以看作是JRE的一个超集,提供了更多工具,比如编译器、各种诊断工具等。
对于“Java是解释执行”这句话,这个说法不太准确。
我们开发的Java的源代码,
- 通过Javac编译成为字节码(bytecode)
- 在运行时,通过 Java虚拟机(JVM)内嵌的
解释器将字节码转换成为最终的机器码。
常见的JVM,比如我们大多数情况使用的
Oracle JDK提供的Hotspot JVM,都提供了JIT(Just-In-Time)编译器,也就是通常所说的
动态编译器, JIT能够在运行时将热点代码编译成机器码,这种情况下部分热点代码就属于编译执行,而不是解释执行了。
Exception和Error的区别
- Exception和Error都是继承了Throwable类,在Java中只有Throwable类型的实例才可以被抛出(throw)或者捕获(catch),它是异常处理机制的基本组成类型。
- Exception和Error体现了Java平台设计者对不同异常情况的分类。
-
Exception是程序正常运行中,可以预料的意外情况,可能并且应该被捕获,进行相应处理。
- Exception又分为可检查(checked)异常和不检查(unchecked)异常
- Error是指在正常情况下,不大可能出现的情况,绝大部分的Error都会导致程序(比如JVM自身)处于非正常的、不可恢复状态。既然是非正常情况,所以不便于也不需要捕获,常见的比如OutOfMemoryError之类,都是Error的子类。
-
Exception是程序正常运行中,可以预料的意外情况,可能并且应该被捕获,进行相应处理。
Try-with-resources
try (BuferedReader br = new BuferedReader(…);
BuferedWriter writer = new BuferedWriter(…)) {// Try-with-resources
// do something
catch ( IOException | XEception e) {// Multiple catch
// Handle it
}
第3讲 | 谈谈fnal、 fnally、 fnalize有什么不同?
- final可以用来修饰类、方法、变量,分别有不同的意义,
- final修饰的class代表不可以继承扩展,
- final的变量是不可以修改的,
- final的方法也是不可以重写的(override)。
- fnally则是Java保证重点代码一定要被执行的一种机制。我们可以使用try-fnally或者try-catch-fnally来进行类似关闭JDBC连接、保证unlock锁等动作。
- fnalize是基础类java.lang.Object的一个方法,它的设计目的是保证对象在被垃圾收集前完成特定资源的回收。 fnalize机制现在已经不推荐使用,并且在JDK 9开始被标记为deprecated。
什么机制可以替换fnalize?
Java平台目前在逐步使用java.lang.ref.Cleaner来替换掉原有的fnalize实现
public class CleaningExample implements AutoCloseable {
// A cleaner, preferably one shared within a library
private satic fnal Cleaner cleaner = <cleaner>;
satic class State implements Runnable {
State(...) {
// initialize State needed for cleaning action
}
public void run() {
// cleanup action accessing State, executed at mos once
}
}
private fnal State;
private fnal Cleaner.Cleanable cleanable
public CleaningExample() {
this.sate = new State(...);
this.cleanable = cleaner.regiser(this, sate);
}
public void close() {
cleanable.clean();
}
}
实现AutoCloseable 重写close方法。
fanlly 不会被执行的情况
- try-cach 异常退出。
try{
system.exit(1)
}fnally{
print(abc)
}
- 无限循环
try{
while(ture){
print(abc)
}
}fnally{
print(abc)
}
- 线程被杀死
当执行 try, fnally 的线程被杀死时。 fnally 也无法执行。
总结
1 不要在 fnally 中使用 return 语句。
2 fnally 总是执行,除非程序或者线程被中断。