整理Java基础知识遇到的问题

1.jdk1.5之后的三大版本

  • Java SE(J2SE,Java 2 Platform Standard Edition,标准版)
    JavaSE是Java中的基础部分,不du过后来的各种框架zhi,各种产品都是基于JavaSE,也就是daoJavaSE是java向上发展的基础,Java任何高级产品的底层基础都是JavaSE,所以如果要学习,把它学扎实,牢固是很有必要的
    Java SE 以前称为 J2SE。它允许开发和部署在桌面、服务器、嵌入式环境和实时环境中使用的 Java 应用程序。Java SE 包含了支持 Java Web 服务开发的类,并为Java EE和Java ME提供基础。

  • Java EE(J2EE,Java 2 Platform Enterprise Edition,企业版)
    Java EE 以前称为 J2EE。企业版本帮助开发和部署可移植、健壮、可伸缩且安全的服务器端Java 应用程序。Java EE 是在 Java SE 的基础上构建的,它提供 Web 服务、组件模型、管理和通信 API,可以用来实现企业级的面向服务体系结构(service-oriented architecture,SOA)和 Web2.0应用程序。2018年2月,Eclipse 宣布正式将 JavaEE 更名为 JakartaEE

  • Java ME(J2ME,Java 2 Platform Micro Edition,微型版)
    Java ME 以前称为 J2ME。Java ME 为在移动设备和嵌入式设备(比如手机、PDA、电视机顶盒和打印机)上运行的应用程序提供一个健壮且灵活的环境。Java ME 包括灵活的用户界面、健壮的安全模型、许多内置的网络协议以及对可以动态下载的连网和离线应用程序的丰富支持。基于 Java ME 规范的应用程序只需编写一次,就可以用于许多设备,而且可以利用每个设备的本机功能。

2.JVM、JRE和JDK的关系

  • jdk是Java开发工具包,JDK中包含JRE,在JDK的安装目录下有一个名为jre的目录,里面有两个文件夹bin和lib,在这里可以认为bin里的就是jvm,lib中则是jvm工作所需要的类库而jvm和 lib和起来就称为jre。JDK是整个JAVA的核心,包括了Java运行环境JRE(Java Runtime Envirnment)、一堆Java工具(javac/java/jdb等)和Java基础的类库(即Java API 包括rt.jar)。还包含了很多java程序调试和分析的工具:jconsole,jvisualvm等工具软件,还包含了java程序编写所需的文档和demo例子程序。
  • jvm 就是我们常说的java虚拟机,它是整个java实现跨平台的最核心的部分,所有的java程序会首先被编译为.class的类文件,这种类文件可以在虚拟机上执行。也就是说class并不直接与机器的操作系统相对应,而是经过虚拟机间接与操作系统交互,由虚拟机将程序解释给本地系统执行。只有JVM还不能成class的执行,因为在解释class的时候JVM需要调用解释所需要的类库lib,而jre包含lib类库。JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。
  • jre是运行基于Java语言编写的程序所不可缺少的运行环境。也是通过它,Java的开发者才得以将自己开发的程序发布到用户手中,让用户使用。JRE中包含了Java virtual machine(JVM),runtime class libraries和Java application launcher,这些是运行Java程序的必要组件。与大家熟知的JDK不同,JRE是Java运行环境,并不是一个开发环境,所以没有包含任何开发工具(如编译器和调试器),只是针对于使用Java程序的用户。

如果你需要运行java程序,只需安装JRE就可以了。如果你需要编写java程序,需要安装JDK。

在这里插入图片描述

3.java的跨平台性

java源程序先经过javac编译器编译成二进制的.class字节码文件(java的跨平台指的就是.class字节码文件的跨平台,.class字节码文件是与平台无关的),.class文件再运行在jvm上,java解释器(jvm的一部分)会将其解释成对应平台的机器码执行,所以java所谓的跨平台就是在不同平台上安装了不同的jvm,而在不同平台上生成的.class文件都是一样的,而.class文件再由对应平台的jvm解释成对应平台的机器码执行,我们常说的一次编译,到处运行指的就是class文件

4.关于java的平台无关性

平台无关性,其实对于平台无关性本人是持怀疑态度的,因为jvm的存在,使得我们编译完成后的class文件可以运行在不同的操作系统上,其原理就是只要你装有jvm,那么他就认识这个JAVA字节码,翻译成对应平台的机器码执行,机器码再继续操作硬件,但是java是不能操作硬件的,在并发多线程中就更加明显了,我们只需要调用API就可以实现对线程的各种操作,而不用去关心具体的操作系统,这给人的感觉就是java实现了不同硬件不同操作系统对线程的统一处理,但是jvm通过调用C++从而达到创建线程,销毁线程,并且众多的api都有native关键字修饰,这就说明java并不是真正的实现了平台无关性,举个例子来说明:java线程都是被映射到原生线程上来实现,java的线程调度最终由操作系统说了算,在我们设置线程优先级对有的操作系统有用,有的操作系统就不管用了,拿Windows来说,windows本身就实现了线程的不同优先级,java通过底层调用C++来设置windows的线程优先级,并且Windows的优先级和jvm的优先级吻合程度高,因此jvm在windows环境下实现线程的优先级就更加明显,在某些系统中,它的线程优先级就非常少,根本无法对应上java的优先级,所有很可能出现多个优先级对应到同一个操作系统的优先级上的情况了,所以我认为java的平台无关性要具体情况具体分析了

5.java为什么要有字节码文件

要非说什么好处,我感觉就是符合java跨平台的特性了,还有就是可以通过反编译来了解代码运行的原理,最重要的一个就是执行效率的问题:按照我的理解,jvm是不能直接执行java文件的,必须要是class文件,java文件经javac编译后才能被jvm执行(这里说执行太笼统了,因为是基础知识就不需要涉及的太深入,如果有想深入了解的可以看我的这篇文章:jvm执行引擎:后端编译的运行过程和原理),这个编译过程通常要耗费一定的时间,成为class文件后就可以立即执行,提高程序执行效率,其实到这里可以稍微扩展一下:

其实问你什么字节码,就相当于校验你是否懂得什么是解释型语言,编译型语言了。

  • 编译型语言:用简单的话来概括就是通过编译器将代码编译完成后生成本地缓存,下次再调用的时候就不需要再次编译,直接从缓存中获取,因为只需编译一次,以后运行时不需要编译,所以编译型语言执行效率高。现有的C、C++、Objective等都属于编译型语言。
    • 一次性的编译成平台相关的机器语言文件,运行时脱离开发环境,运行效率高,由于这个原因导致这类语言与特定平台相关,一般无法移植到其他平台
  • 解释型语言:解释型语言不需要事先编译,其直接将源代码解释成机器码并立即执行,所以只要某一平台提供了相应的解释器即可运行该程序。Python等属于解释型语言。字节码也是解释型的一部分。

那么java属于哪一种呢?其实java是一种半编译半解释语言:java在JDK1.0时代,程序都是通过解释器来执行的,所以java在最初的时候运行速度是不如C/C++的,后来虚拟机发展了即时编译器可以直接生成本地缓存,java程序的执行效率得到大大提升,现在的jvm在执行java代码的时候既可以通过解释器执行,也可以通过即时编译器执行,,但大多数情况下将两者结合使用,所以将Java称为半编译半解释型语言

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章