前言:本文属于黑马程序员和
javaguide
的混合笔记,仅作学习分享使用,建议感兴趣的小伙伴去看黑马原视频或javaguide
原文。如有侵权,请联系删除。
Java类型:
- JavaSE 标准版:以前称为J2SE,主要用来开发桌面应用程序或简单的服务器应用程序。
- JavaEE 企业版:建立在 Java SE 的基础上,包含了支持企业级应用程序开发和部署的标准和规范(如Servlet、Jsp、JDBC、JPA等),以前称为J2EE。 可以用于构建分布式、可移植、健壮安全的服务端 Java 应用程序,例如 Web 应用程序。
- JavaME 微型版:以前称为J2ME,主要用于开发嵌入式设备的应用程序
java语言特性:
底层:C++编写
最重要的特性如下:
- 可移植性(可移植到如
Linux
,windows
等不同的系统,其中通过JVM
,即Java
虚拟机实现) - 编译与解释并存
- 面向对象(封装、继承、多态)
- 安全性(防范运行时堆栈溢出,未经授权读写文件,破坏自己的进程空间之外的内存等)
- 支持多线程(最开始的C++ 语言没有内置的多线程机制)
其他特性如下(主要是和C++比,毕竟底层是C++编写的,两者都是面向对象的语言):
- java类内只有单继承,但支持接口之间的多继承。 C++支持多重继承。
- java无指针。 所以不能用指针直接访问内存,内存更安全。
- java无操作符重载,只支持方法重载。C++支持操作符和方法重载。
- java具有可靠性,具备自动内存管理垃圾回收机制(GC),不需要程序员手动释放无用内存。
DOS命令:
window+R+cmd+回车
启动DOS
窗口
清屏 cls
复制 选择任意内容 即可复制成功
显示该路径下所有子路径 dir
切换路径 cd
(后面如果直接加文件名,则不能是上级路径。如果要访问上级路径,需要输入访问的文件的绝对路径)
相对路径:表示该路径将当前所在的路径作为出发点的路径
如:34519\Pictures>
绝对路径:表示该路径将某个磁盘的盘符下作为出发点的路径
如:C:\Users\34519\Pictures>
返回上级 cd ..
返回根目录 cd \
切换盘符 c:
或 d:
java的编译与运行
一段java
代码的编译与运行全流程如下:
.java
:java
源文件
.class
:可以看作类文件,或者说字节码文件(并不是纯粹的二进制文件)
机器码
:机器可理解的代码,纯二进制文件。
那么首先就是.java
文件通过javac
编译生成多个.class
文件,即字节码文件。然后启动JVM
,JVM
启动类加载器ClassLoader
。后者去搜索.class
文件并将其装载到JVM
中。最后转为机器码由操作系统识别并运行。
机器码 vs 字节码
由上述过程可以看到机器码和字节码是不同的东西,可以看成:.class
文件 = 字节码 ≠ 机器码
java编译(主要用JDK编译)
JDK(java开发工具包)
JDK
是一个功能齐全的 Java
开发工具包,供开发者使用,用于创建和编译 Java
程序。它包含了 JRE
,以及编译器 javac
和其他工具,如jdb
(调试器)、javap
(反编译工具)等。
不同编程语言(Java
、Groovy
、Kotlin
…)有各自的编译器,如下:
java解释(主要用JVM解释)
JVM(Java 虚拟机)
是运行 Java
字节码的虚拟机。JVM
有针对不同系统的特定实现(Windows
,Linux
,macOS
),目的是使用相同的字节码,它们都会给出相同的结果(机器码),这也是 Java
语言**“一次编译,随处运行”**的关键所在。
具体来说是 JVM
启动 类加载器 Class Loader
,首先加载字节码文件,然后通过解释器逐行解释执行,这种方式的执行速度会相对比较慢。而且,有些方法和代码块是经常需要被调用的(也就是所谓的热点代码),所以后面引进了 JIT(Just in Time Compilation) 编译器
,而 JIT
属于运行时编译。当 JIT
编译器完成第一次编译后,其会将字节码对应的机器码保存下来,下次可以直接使用。机器码的运行效率肯定是高于 Java
解释器的。这也解释了我们为什么经常会说 Java 是编译与解释共存的语言。
请注意:JVM
并不是只有一种!只要满足 JVM
规范,每个公司、组织或者个人都可以开发自己的专属 JVM
。 也就是说我们平时接触到的 HotSpot VM
仅仅是是 JVM
规范的一种实现而已。
JRE(Java运行环境)
JRE
是运行 .class文件所需的环境,主要包含以下两个部分:JVM
和Java
基础类库(Class Library
)
JVM
也就是我们上面提到的 Java
虚拟机。
Java
基础类库:一组标准的类库,提供常用的功能和 API
(如 I/O
操作、网络通信、数据结构等)。
JVM vs JDK vs JRE vs JIT
所以,关系最终总结如下:
一个简单的Java程序的特点:
每个文件只能包含一个public
类(也可以没有),如果有,源文件名与该public
类的名字相同。
主类是指包含main
方法的类,自身不一定要是public
类。
public class HelloWorld {public static void main(String[] args) {System.out.println("Hello, World!");}
}