聊聊 Java 的一些特性

183 阅读4分钟

聊起 Java 的时候,是想起蓝红相间的咖啡图标,还是 "write once,run anywhere" 的口号。说到 Java 的特性,这两个是核心:跨平台能力,以及垃圾回收能力。

一、write once,run anywhere

编写一次,到处运行,解决的是跨平台的问题。不同操作系统提供的能力不同,相同功能的程序在不同的操作系统下,需要不同的写法。

比如用 C 语言实现了某个功能,用到了macOS 提供的系统能力,那该程序在 windows 下就无法编译运行,需改成 windows 操作系统提供的能力。

Java 通过提供一个程序运行环境来屏蔽掉这层差异,Java 程序运行到这个环境里面,环境去适配底层的操作系统的不同接口,这样写程序的人就不用关心操作系统的差异性,实现了编写一次到处运行的效果。

这个程序运行的环境,其实就是 jdk,所以编写 Java 代码的第一步,就是“装环境”。

二、解释型与编译型

编译,是将源代码转换成机器码的过程,负责该过程的程序,叫做编译器,编译后会产生机器码文件;解释,是运行时逐行将源代码转成机器码并运行的过程,没有机器码文件的产生。

比如明天要进行一场英文演讲,但稿件是中文的,通常会怎么过做呢?有两种选择,要么提前把中文稿件翻译成英文,明天直接按照英文稿件演讲,假设后天也有一场演讲,可以复用这份稿件,不用重新翻译,那中文翻译为英文的过程,就叫做编译,你相当于编译器的角色。

另一种选择,是不提前翻译稿件,等演讲的时候,对着英文稿实时翻译成中文,这个过程就成为解释,你相当于解释器的角色,如果后天也有演讲,那需要再实时翻译一次。

也有人用做菜来做比喻,编译运行就好似做好了一桌子菜,然后再开吃,解释运行是吃火锅,边涮边吃。可以看出,编译运行的执行效率会高一点,涮火锅则会吃的慢一些。

那 Java 是什么类型的语言呢?当说一门语言是编译型语言的时候,到底是指什么呢?

我们开发完成后,对代码进行编译,这时候编译器会将 Java 源码编译成字节码(.class文件),运行时,JVM 会加载字节码,并把字节码转换成机器码,这么看来,Java 似乎是属于解释型的语言。

image.png

但实际上,大多数常用的 JVM 中,都提供了 JIT(Just-In-Time) 技术,也就是动态编译,JIT 能够将热点代码直接编译成机器码,来提高热点代码的执行速度。并且,在 Java 9 中,还提供了 AOT 编译器,支持将所有的代码直接编译成机器码。那这么看来,在部分场景下,Java 又属于是编译型的语言。

所以,总的来说,Java 的底子是属于解释型,但因为解释型效率的低下,又引入了 JIT 技术,AOT 技术来提高运行效率,所以 Java 也有编译型的基因。那这么看来这个分类并不是非此即彼的,需要根据具体的情况来分析。

三、JRE 与 JDK

常常看到的 JRE 和 JDK 是什么关系呢?简单来说,JDK 包括 JRE,JRE 是 JDK 的子集,JDK 是 JRE 的超集。 JRE:Java Runtime Environment,Java运行环境,包括 JVM,类库等; JDK:Java Development Kit,Java 开发包,包括 JRE,也包括编译器,诊断工具等

image.png

四、垃圾回收

除了跨平台能力,垃圾回收能力也是 Java 强大的特性之一,那垃圾回收解决的是什么问题呢?

初学 C 语言的时候,大概率面临过被指针支配的恐惧,C 语言中,需要自己申请内存,通过指针操作内存,并自己释放内存,而对内存管理不当,就会带来内存泄漏等问题,这样的设计无形中抢占了程序员的注意力,无法专注在完成功能上,需要额外的精力去考虑内存的使用,总的来说,降低了生产力。

垃圾回收技术,就是屏蔽掉内存管理的细节,降低内存泄漏的概率,就像一个专业的内存管家,分担程序员的精力,这样就可以有更多的心思花在实现功能上,但对应的,对内存的使用也失去了一定的灵活性。

五、总结

总的来说,从机器码到汇编语言,再到如今的高级语言,使用起来越来越方便,越来越容易编写与交流。如今习以为常的功能,在大背景下看,才知道当时需要解决的痛点,感受到语言的伟大之处。

\