Java的设计

我们学习Java,首先要安装JDK,并把它配置到系统的环境变量中,那你了解JDK的构成吗?JDK里边囊括了:

  • 编译器等开发工具
  • JRE(Java运行时环境)
    - 运行类库(本地方法的封装)
    - JVM(指挥系统底层)
    image.png

所以,其实如果想要让Java程序运行起来,我们只需要JRE,但我们作为程序开发人员还需要将Java代码编译成.class字节码文件等操作,所以我们需要下载、安装、配置完整的JDK

Java是一种跨平台设计的语言,他是如何跨平台的呢?——JVM
JVM是啥,你可以理解为一个虚拟的容器,所有的.Java代码经过编译.class之后都是在这个虚拟的容器中执行,而不是由你的操作系统直接执行。
JVM理解代码语义后指挥操作系统执行
Java官方对应的为各个操作系统和平台提供了不同的一套JVM实现
也就是说相当于Java自己去适配各个平台,完成系统底层代码的转化、
这便是Java一套代码一次编译到处运行的真相

所以我们Java代码从编写到最终执行需要以下流程:

  • 编写【Java源代码】
  • 编译【javac命令——得到.class字节码文件】
  • 运行【java命令(- jar)——启动运行jar包】

其实JVM不仅仅只是跨平台那么简单,如果你学过C语言你就会知道,我们每当创建一个流对象之后都要手动关闭,每次创建对象都要自己去申请空间,而Java是不需要的,因为这些JVM会帮我们做,他有一套自己的垃圾回收机制
而且它他还会帮我们处理和优化代码。也就是所谓编译器优化,大概你可以理解为帮我们以它认为合理的视角去调整代码的顺序来取得更优的效率(但有时候这可能会导致意外的错误),记一下JVM的两点优化

  • 对于byte/short/char三种类型来说,如果右侧赋值的数值没有超过范围,那么javac编译器将会自动隐含地为我们补上一个(byte)(short)(char)。

    • 如果没有超过左侧的范围,编译器补上强转。
    • 如果右侧超过了左侧范围,那么直接编译器报错。
  • 在给变量进行赋值的时候,如果右侧的表达式当中全都是常量,没有任何变量,那么编译器javac将会直接将若干个常量表达式计算得到结果。short result = 5 + 8; // 等号右边全都是常量,没有任何变量参与运算。编译之后,得到的.class字节码文件当中相当于【直接就是】:short result = 13;
    右侧的常量结果数值,没有超过左侧范围,所以正确。这称为“编译器的常量优化”。
    但是注意:一旦表达式当中有变量参与,那么就不能进行这种优化了。

最后说一下Java的内存划分:
主要是方法入栈压栈、对象堆在一起,方法类字节码方法区
image.png