1. Java简介、发展史、应用领域
1.1 Java简介
Java 是一种由 Sun Microsystems 公司(现已被 Oracle 收购)于 1995 年发布的面向对象的编程语言。它以其“一次编写,到处运行”(Write Once, Run Anywhere, WORA)的特性而闻名,这意味着用 Java 编写的程序可以在任何支持 Java 的平台上运行,无需重新编译。
Java 的设计目标是:
- 简单性:易于学习和使用。
- 面向对象:支持面向对象编程的所有核心概念。
- 分布式:支持网络编程,易于构建分布式应用。
- 健壮性:具有强大的错误检查和异常处理机制。
- 安全性:内置安全机制,防止恶意代码的攻击。
- 体系结构中立:不依赖于特定的硬件或操作系统。
- 可移植性:编译后的字节码可以在任何 Java 虚拟机(JVM)上运行。
- 高性能:通过即时编译(JIT)技术实现高性能。
- 多线程:支持多线程编程,提高程序并发性。
- 动态性:能够在运行时动态加载类和对象。
1.2 Java发展史
- 1991年:Sun Microsystems 的詹姆斯·高斯林(James Gosling)等人启动“Green Project”,旨在开发一种用于家用电器的新语言,最初命名为 Oak。
- 1995年:Oak 更名为 Java,并正式发布 Java 1.0 版本,提出“一次编写,到处运行”的口号。
- 1996年:发布 JDK 1.0,Java 语言迅速获得关注。
- 1998年:发布 J2SE 1.2(后改名为 Java SE 1.2),引入了 Swing、Collections Framework 等重要特性。
- 2000年:发布 J2SE 1.3,性能和稳定性进一步提升。
- 2002年:发布 J2SE 1.4,引入了 NIO、正则表达式、XML 解析等。
- 2004年:发布 J2SE 5.0(内部版本号为 1.5),这是一个里程碑版本,引入了泛型、注解、枚举、自动装箱/拆箱、可变参数、增强型 for 循环等大量新特性。
- 2006年:发布 Java SE 6,改进了性能和稳定性,并提供了更好的 Web 服务支持。
- 2011年:发布 Java SE 7,引入了对动态语言的支持、try-with-resources 语句、NIO.2 等。
- 2014年:发布 Java SE 8,又一个里程碑版本,引入了 Lambda 表达式、Stream API、新的日期时间 API 等,极大地简化了并发编程和集合操作。
- 2017年:发布 Java SE 9,引入了模块化系统(Jigsaw 项目),改进了性能和安全性。
- 2018年至今:Java 采用半年发布一次新版本的策略,陆续发布了 Java 10, 11 (LTS), 12, 13, 14, 15, 16, 17 (LTS) 等版本,持续引入新特性和改进。
1.3 Java应用领域
Java 语言因其跨平台、高性能和丰富的生态系统,在众多领域都有广泛应用:
- 企业级应用开发:Java EE (Enterprise Edition) 是开发大型、分布式、高并发企业级应用的首选平台,广泛应用于金融、电信、电子商务等领域。Spring、Spring Boot、Hibernate 等框架是其核心。
- Android 移动应用开发:Android 应用程序主要使用 Java(或 Kotlin)进行开发。Java 在 Android 生态系统中扮演着核心角色。
- 大数据技术:Hadoop、Spark、Kafka 等许多流行的大数据技术都是用 Java(或 Scala,运行在 JVM 上)编写的,Java 在大数据处理中占据重要地位。
- Web 应用开发:Java Servlets、JSP、Spring MVC、Spring Boot 等技术栈广泛用于构建各种规模的 Web 应用程序。
- 桌面应用开发:虽然不如 Web 和移动应用流行,但 JavaFX 和 Swing 仍然可以用于开发跨平台的桌面应用程序。
- 游戏开发:Minecraft 等知名游戏就是用 Java 开发的。Java 在游戏开发领域也有一定的应用。
- 嵌入式系统:Java ME (Micro Edition) 曾用于开发嵌入式设备和移动电话应用。
- 云计算:Java 在云计算平台和微服务架构中扮演着重要角色,许多云服务和工具都支持 Java。
2. JDK安装与配置(环境变量)
2.1 什么是JDK、JRE、JVM?
在安装和配置 Java 开发环境之前,我们需要理解几个核心概念:
- JVM (Java Virtual Machine):Java 虚拟机。它是 Java 程序的运行环境,负责将 Java 字节码(.class 文件)解释或编译成特定平台的机器码并执行。JVM 是 Java 跨平台能力的核心。
- JRE (Java Runtime Environment):Java 运行时环境。它包含了 JVM 和 Java 核心类库(如
java.lang
,java.util
等)。如果你只是想运行 Java 程序,那么安装 JRE 就足够了。 - JDK (Java Development Kit):Java 开发工具包。它是 Java 开发的核心,包含了 JRE、JVM 以及开发 Java 应用程序所需的工具,如编译器(
javac
)、打包工具(jar
)、调试工具(jdb
)等。如果你需要开发 Java 程序,就必须安装 JDK。
简单来说:JDK = JRE + 开发工具,JRE = JVM + 核心类库。
2.2 JDK下载
- 访问 Oracle 官方网站的 Java SE 下载页面:
- 选择你需要的 JDK 版本。通常建议下载最新的 LTS (Long-Term Support) 版本,例如 Java 11 或 Java 17,因为它们会获得更长时间的支持和更新。
- 根据你的操作系统(Windows, macOS, Linux)和系统架构(x64, ARM64)选择对应的安装包。
- 接受许可协议并下载。
2.3 JDK安装
安装过程通常非常简单,按照安装向导的指示一步步操作即可。
- Windows:双击下载的
.exe
安装包,然后按照提示点击“下一步”直到安装完成。你可以选择安装路径,建议选择一个不包含中文和空格的路径,例如C:\Program Files\Java\jdk-17
。 - macOS:双击下载的
.dmg
文件,然后双击.pkg
安装包,按照提示完成安装。macOS 通常会将 JDK 安装到/Library/Java/JavaVirtualMachines/
目录下。 - Linux:下载
.tar.gz
压缩包后,解压到你选择的目录,例如/usr/local/java/jdk-17
。具体命令如下:sudo mkdir -p /usr/local/java sudo tar -zxvf jdk-*-linux-x64.tar.gz -C /usr/local/java/
2.4 配置环境变量
配置环境变量的目的是让操作系统能够找到 Java 相关的命令(如 java
和 javac
),无论你在哪个目录下执行它们。
2.4.1 Windows 系统
- 找到 JDK 安装路径:例如
C:\Program Files\Java\jdk-17
。 - 打开系统属性:右键点击“此电脑”或“我的电脑” -> “属性” -> “高级系统设置” -> “环境变量”。
- 新建
JAVA_HOME
变量:- 在“系统变量”区域,点击“新建”。
- 变量名:
JAVA_HOME
- 变量值:你的 JDK 安装路径(例如
C:\Program Files\Java\jdk-17
) - 点击“确定”。
- 编辑
Path
变量:- 在“系统变量”区域,找到并选中
Path
变量,点击“编辑”。 - 点击“新建”,然后输入
%JAVA_HOME%\bin
。 - 将
%JAVA_HOME%\bin
移动到列表的顶部,确保它优先被查找。 - 点击“确定”保存所有更改。
- 在“系统变量”区域,找到并选中
2.4.2 macOS 系统
macOS 通常会自动配置好 Java 路径,但如果需要手动配置或切换 JDK 版本,可以编辑 shell 配置文件(如 ~/.bash_profile
, ~/.zshrc
或 ~/.profile
)。
- 打开终端。
- 编辑配置文件:
- 如果你使用 Bash:
nano ~/.bash_profile
或vim ~/.bash_profile
- 如果你使用 Zsh(macOS Catalina 及更高版本默认):
nano ~/.zshrc
或vim ~/.zshrc
- 如果你使用 Bash:
- 添加以下内容:
export JAVA_HOME=$(/usr/libexec/java_home) export PATH=$JAVA_HOME/bin:$PATH
$(/usr/libexec/java_home)
会自动找到当前系统默认的 JDK 路径。如果你安装了多个 JDK 版本并想指定特定版本,可以手动设置JAVA_HOME
,例如:
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home
- 保存并退出文件。
- 使配置生效:
- 如果你编辑的是
~/.bash_profile
:source ~/.bash_profile
- 如果你编辑的是
~/.zshrc
:source ~/.zshrc
- 如果你编辑的是
2.4.3 Linux 系统
编辑 /etc/profile
文件(对所有用户生效)或 ~/.bashrc
/ ~/.profile
文件(对当前用户生效)。建议编辑 /etc/profile
。
- 打开终端。
- 编辑配置文件:
sudo nano /etc/profile
或sudo vim /etc/profile
- 在文件末尾添加以下内容:
# Java Environment Variables export JAVA_HOME=/usr/local/java/jdk-17 # 替换为你的JDK实际安装路径 export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
CLASSPATH
变量用于指定 Java 虚拟机查找类文件的路径,.
表示当前目录。
- 保存并退出文件。
- 使配置生效:
source /etc/profile
2.5 验证安装
打开一个新的命令行窗口(或终端),输入以下命令来验证 JDK 是否安装成功并配置正确:
java -version
javac -version
如果显示了 Java 和 Javac 的版本信息,说明 JDK 已成功安装并配置完成。
3. 第一个Java程序:Hello World
现在,我们来编写并运行第一个 Java 程序。
3.1 编写源代码
-
创建文件:在你的电脑上创建一个新的文本文件,命名为
HelloWorld.java
。请确保文件名与类名完全一致(包括大小写),并且文件扩展名为.java
。 -
编写代码:用任何文本编辑器(如 VS Code, Sublime Text, Notepad++ 等)打开
HelloWorld.java
文件,并输入以下代码:public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World!"); } }
代码解释:
public class HelloWorld
:定义了一个公共类,类名为HelloWorld
。Java 程序的入口点必须在一个公共类中。public static void main(String[] args)
:这是 Java 程序的主方法,是程序执行的起点。它是:public
:公共的,意味着可以从任何地方访问。static
:静态的,意味着可以通过类名直接调用,无需创建类的实例。void
:表示方法不返回任何值。main
:方法的名称,Java 虚拟机就是从这里开始执行程序的。String[] args
:命令行参数,允许你在运行程序时向其传递信息。
System.out.println("Hello, World!");
:这是一个输出语句,用于在控制台打印“Hello, World!”字符串。System.out
代表标准输出流,println
表示打印一行并换行。
3.2 编译程序
-
打开命令行窗口:导航到你保存
HelloWorld.java
文件的目录。 -
编译:使用
javac
命令编译源代码文件。如果编译成功,会在同目录下生成一个HelloWorld.class
文件(字节码文件)。javac HelloWorld.java
如果出现错误,请检查你的代码是否有拼写错误、标点符号错误,或者环境变量是否配置正确。
3.3 运行程序
-
运行:使用
java
命令运行编译后的字节码文件。注意,这里不需要.class
扩展名。java HelloWorld
-
查看输出:如果一切顺利,你将在命令行窗口看到输出:
Hello, World!
恭喜你,你已经成功编写并运行了你的第一个 Java 程序!
4. Java程序运行机制
Java 程序的运行机制是其“一次编写,到处运行”特性的基础。它主要涉及到以下几个步骤和组件:
-
编写 Java 源代码 (
.java
文件):
开发者使用 Java 语言编写程序,保存为.java
扩展名的文本文件。这些文件包含了人类可读的指令。 -
编译 (
javac
命令):
Java 编译器(javac
)将.java
源代码文件编译成平台无关的字节码文件(.class
文件)。字节码是一种中间代码,它不直接在操作系统上运行,而是在 Java 虚拟机(JVM)上运行。这个阶段会检查语法错误。- 源代码 (
HelloWorld.java
) –javac
--> 字节码 (HelloWorld.class
)
- 源代码 (
-
类加载器 (Class Loader):
当 Java 程序运行时,JVM 的类加载器负责查找并加载.class
文件到内存中。类加载器遵循特定的加载机制(如双亲委派模型),确保类的安全性和唯一性。 -
字节码校验器 (Bytecode Verifier):
在字节码加载到内存后,字节码校验器会对字节码进行检查,确保其符合 Java 语言规范和 JVM 规范,没有安全问题或格式错误。这是 Java 安全性的重要组成部分。 -
解释器 (Interpreter) 和 即时编译器 (JIT Compiler):
JVM 包含解释器和即时编译器(Just-In-Time Compiler)。-
解释器:逐行解释字节码并执行。这种方式启动速度快,但执行效率相对较低。
-
JIT 编译器:为了提高执行效率,JVM 会监控程序的运行情况。对于频繁执行的代码(“热点代码”),JIT 编译器会将其编译成特定平台的机器码,并缓存起来。下次再执行这部分代码时,就可以直接运行机器码,从而大大提高执行速度。这个过程被称为“动态编译”。
-
字节码 (
HelloWorld.class
) – JVM (解释器/JIT) --> 机器码 – 操作系统/硬件 --> 执行
-
-
运行时数据区 (Runtime Data Areas):
JVM 在运行程序时会划分出不同的内存区域,用于存储程序运行时的数据,包括:- 方法区 (Method Area):存储类信息、常量、静态变量等。
- 堆 (Heap):存储对象实例和数组。这是 Java 内存管理的核心区域,也是垃圾回收的主要作用区域。
- 虚拟机栈 (VM Stack):存储方法调用的栈帧,每个栈帧包含局部变量表、操作数栈、动态链接、方法出口等。
- 本地方法栈 (Native Method Stack):为
Native
方法(非 Java 语言实现的方法)服务。 - 程序计数器 (Program Counter Register):存储当前线程正在执行的字节码指令的地址。
-
垃圾回收器 (Garbage Collector):
Java 具有自动内存管理机制,即垃圾回收。当堆中的对象不再被引用时,垃圾回收器会自动回收这些对象占用的内存,无需程序员手动管理内存,从而避免了内存泄漏和野指针等问题。
总结流程:
Java源代码 (.java)
--(javac编译)–> Java字节码 (.class)
--(JVM加载、校验、解释/JIT编译)–> 机器码
--(操作系统执行)–> 程序运行结果
这种机制使得 Java 具有了强大的跨平台能力和相对高效的执行性能。