1、Java简介+DOS命令+java的编译运行(字节码/机器码、JRE/JVM/JDK的区别)+一个简单的Java程序
Java类型:
- JavaSE 标准版:以前称为J2SE,主要用来开发桌面应用程序或简单的服务器应用程序。
- JavaEE 企业版:建立在 Java SE 的基础上,包含了支持企业级应用程序开发和部署的标准和规范(如Servlet、Jsp、JDBC、JPA等),以前称为J2EE。 可以用于构建分布式、可移植、健壮安全的服务端 Java 应用程序,例如 Web 应用程序。
- JavaME 微型版:以前称为J2ME,主要用于开发嵌入式设备的应用程序
java语言特性:
底层:C++编写
最重要的特性如下:
- 可移植性(可移植到如Linux,windows等不同的系统,其中通过JVM,即Java虚拟机实现)
- 编译与解释并存
- 面向对象(封装、继承、多态)
- 可靠性(具备异常处理和自动内存管理机制)
- 安全性(防范运行时堆栈溢出,未经授权读写文件,破坏自己的进程空间之外的内存等)
- 支持多线程(最开始的C++ 语言没有内置的多线程机制)
其他特性如下:
- 类内只有单继承,但支持接口之间的多继承和类与接口之间的实现机制。
- 分布式。
- 无指针。
- 无操作符重载。
- 无虚基类。
DOS命令:
window+R+cmd+回车
清屏 cls
复制 选择任意内容 即可复制成功
显示该路径下所有子路径 dir
切换路径 cd(后面如果直接加文件名,则不能是上级路径。如果要访问上级路径,需要输入访问的文件的绝对路径)
相对路径:表示该路径将当前所在的路径作为出发点的路径
如:34519\Pictures>
绝对路径:表示该路径将某个磁盘的盘符下作为出发点的路径
如:C:\Users\34519\Pictures>
返回上级 cd …
返回根目录 cd \
切换盘符 c: 或 d:
java的编译与运行(JVM vs JDK vs JRE)
一个java
源文件通过javac
编译生成多个.class
文件,即字节码(并不是纯粹的二进制文件)
.class
文件可以看作类文件。通过启动JVM
,JVM
启动类加载器ClassLoader
。后者去搜索.class
文件并将其装载到JVM
中。然后转为二进制文件由操作系统识别并运行。
JVM(Java 虚拟机)
是运行 Java
字节码的虚拟机。JVM
有针对不同系统的特定实现(Windows
,Linux
,macOS
),目的是使用相同的字节码,它们都会给出相同的结果。字节码和不同系统的 JVM
实现是 Java
语言“一次编译,随处可以运行”的关键所在。如下图所示,不同编程语言(Java
、Groovy
、Kotlin
…)通过各自的编译器编译成 .class
文件,并最终通过JVM
在不同系统上运行。
JVM
并不是只有一种!只要满足 JVM
规范,每个公司、组织或者个人都可以开发自己的专属 JVM
。 也就是说我们平时接触到的 HotSpot VM
仅仅是是 JVM
规范的一种实现而已。
JDK(java开发工具包)
JDK
是一个功能齐全的 Java
开发工具包,供开发者使用,用于创建和编译 Java 程序。它包含了 JRE
,以及编译器 javac
和其他工具,如jdb
(调试器)、javap
(反编译工具)等。
JRE(java运行环境)
JRE
是运行已编译 Java 程序所需的环境,主要包含以下两个部分:JVM
: 也就是我们上面提到的 Java
虚拟机。Java
基础类库(Class Library
):一组标准的类库,提供常用的功能和 API
(如 I/O
操作、网络通信、数据结构等)。
在 Java 中,JVM 可以理解的代码就叫做字节码(即扩展名为 .class 的文件),它不面向任何特定的处理器,只面向虚拟机。Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以, Java 程序运行时相对来说还是高效的(不过,和 C、 C++,Rust,Go 等语言还是有一定差距的),而且,由于字节码并不针对一种特定的机器,因此,Java 程序无须重新编译便可在多种不同操作系统的计算机上运行。Java 程序从源代码到运行的过程如下图所示:
我们需要格外注意的是 .class->机器码 这一步。在这一步 JVM 类加载器首先加载字节码文件,然后通过解释器逐行解释执行,这种方式的执行速度会相对比较慢。而且,有些方法和代码块是经常需要被调用的(也就是所谓的热点代码),所以后面引进了 JIT(Just in Time Compilation) 编译器,而 JIT 属于运行时编译。当 JIT 编译器完成第一次编译后,其会将字节码对应的机器码保存下来,下次可以直接使用。而我们知道,机器码的运行效率肯定是高于 Java 解释器的。这也解释了我们为什么经常会说 Java 是编译与解释共存的语言 。
一个简单的Java程序:
每个文件只能包含一个public类(也可以没有),如果有,源文件名与该public类的名字相同。
主类是指包含main方法的类,自身不一定要是public类。
编译源文件,但运行时是运行主类。