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的源代码,

  1. 通过Javac编译成为字节码(bytecode)
  2. 在运行时,通过 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的子类。

java核心技术36讲笔记 一 Java平台的理解

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 不会被执行的情况

  1. try-cach 异常退出。

try{
    system.exit(1)
}fnally{
    print(abc)
}
  1. 无限循环
try{
while(ture){
    print(abc)
}
}fnally{
    print(abc)
}
  1. 线程被杀死
    当执行 try, fnally 的线程被杀死时。 fnally 也无法执行。
总结

1 不要在 fnally 中使用 return 语句。
2 fnally 总是执行,除非程序或者线程被中断。