当咱们写完HelloWorld.java文件后,计算机怎么知道咱们要干什么?那就须要说下编译了(可见文章:JIT编译),这里也简单补充点:前端
1.编程语言:java
编程语言分为高级语言和低级语言:C、C++、Java等属于高级语言;机器语言和汇编语言属于低级语言。那和编译有什么关系呢?程序员
简而言之,编译就是把程序员认识的高级语言转换成机器认识的低级语言的过程,可用命令javac进行编译;相对的,也会存在反编译,把机器看得懂的转成程序员看的懂的,理论上是把class文件转成java文件,但其实是转成了咱们能够看的懂的字节码,要想分析程序运行的背后原理,反编译必不可少。编程
2.编译后端
再来讲下编译,编译可分为前端编译和后端编译,前者与语言有关,目标机器无关;后者与目标机器有关,语言无关。放在Java中,把.java文件编译成.class文件称为前端编译;把.class文件编译成机器语言称为后端编译。缓存
前端编译成的.class文件中的字节码是一种中间代码,其有两点重要性质:易于生成;能轻松的翻译成目标机器上的语言。编程语言
后端编译,会将字节码解释成机器指令,为了提升性能和效率,引入了JIT技术,将“热点代码”翻译成机器指令,优化并缓存起来,以备下次使用。详见:JIT编译文章性能
3.反编译优化
咱们对本地代码进行反编译,来体会一下它的用处。spa
咱们有没有想过枚举类是个什么类?enum是什么意思?这时就须要反编译了:
反编译前:
反编译后:
通过反编译可知,enum类是一个被final修饰的class并继承了lang包下的Enum类,这样咱们就知道它是怎么回事儿了。
再好比:
上面两张图是switch结构的两种数据类型,那有什么不同呢?看是看不出来的,反编译后就知道了:
经过反编译可知,整型的直接比较数值;char类型的比较ascii码,会转成int型,那问题来了,String类型呢?经过反编译将会知道,String类型是经过equals()和hashCode()方法来实现。因此,Switch只支持一种数据类型,那就是整型,其余数据类型都会进行转换。
4.Java 10的本地变量类型推断
3月21日 Java 10发布,简单说一下其本地变量类型的推断。
反编译后获得:
两张图一对比就一目了然,它是个什么样子了。如今都慢慢的换上Java 8了,因此10就先了解这些吧。咱们下期再见!
参考资料:http://www.hollischuang.com/