[JavaSE] 01 - Java 概述和开发环境

因为是刚开始了解 Java,所以感觉还是记得详尽一些比较好。以后的笔记可能会更精简。

1.1 - Java 语言概述

Java 是一种面向对象、静态类型、强类型、跨平台的通用高级程序设计语言,由 Sun 公司于 1995 年正式发布,目前由 Oracle 公司主导维护和发展。

Java 的设计理念是 “Write Once, Run Anywhere”(一次编写,到处运行),即通过 Java 虚拟机(JVM)实现程序在不同操作系统上的跨平台运行。Java 广泛应用于企业级应用、Web 后端开发、分布式系统、大数据处理等领域,是现代软件开发的重要编程语言之一。

image.png

Java 之父 — James Gosling (1955)

1.1.1 - Java 的发展历史

Java 最初由 Sun Microsystems 的 James Gosling(詹姆斯·高斯林)等人开发,其发展经历了以下几个重要阶段。

时间事件
1991 年Sun 启动 Green 项目,开发 Oak 语言,即 Java 的前身
1995 年Java 正式发布
1996 年JDK 1.0 发布
2004 年Java 5 发布,引入泛型、注解、枚举等重要特性
2006 年Sun 开始推动 Java 开源,形成 OpenJDK 项目
2010 年Oracle 收购 Sun Microsystems
2014 年Java 8 发布,引入 Lambda 表达式、Stream API 等
2017 年Java 9 发布,引入模块系统
2018 年Java 11 发布,成为长期支持(LTS)版本
2021 年Java 17 发布,成为 LTS 版本
2023 年Java 21 发布,成为 LTS 版本
2025 年Java 25 发布,成为 LTS 版本

Java 早期版本更新周期较长,自 Java 9 起逐步采用约每六个月发布一个特性版本的机制。

1.1.2 - Java 的主要特点

一、面向对象

Java 以类(Class)和对象(Object)为核心,支持面向对象程序设计的主要机制:

  • 封装(Encapsulation):隐藏对象内部实现细节,通过公开接口访问对象。
  • 继承(Inheritance):允许子类复用和扩展父类的属性与行为。
  • 多态(Polymorphism):允许同一接口或方法调用表现出不同的行为。

但 Java 并不是纯粹的面向对象语言,因为它还提供 int、double、boolean 等基本数据类型,它们不是作为对象存在的(反例有 SmallTalk 和 Ruby 语言,它们的数字、布尔等基础值也是对象)。

二、跨平台

Java 的跨平台能力主要依赖 JVM。Java 程序并不是通常情况下直接编译成某一操作系统的机器码,而是先编译成平台无关的字节码(Bytecode),再由对应平台的 JVM 执行。

因此,Java 字节码具有平台无关性,而 JVM 本身具有平台相关性,这是 Java 实现“一次编写,到处运行”的基础。

image.png

三、自动内存管理

Java 通过垃圾回收机制(Garbage Collection,GC)自动回收不再被使用的堆对象所占用的内存。

C 语言Java
常通过 malloc() 手动分配内存通常使用 new 创建对象
需要通过 free() 手动释放动态内存由垃圾回收器负责回收可回收对象的内存
容易出现悬空指针等问题减少了许多手动内存管理问题

(但是,Java 的自动内存管理并不意味着完全不会发生内存泄漏,也不意味着文件、数据库连接等外部资源可以完全依靠 GC 自动管理。)

四、静态类型与强类型

Java 是静态类型语言,变量和表达式的类型在编译阶段受到检查,编译器能够提前发现许多类型错误,例如:

int age = 20;
age = "Hello"; // 编译错误

Java 对类型转换有明确的规则,不允许任意将不同类型的数据相互赋值。此外,Java 在变量声明、方法参数、返回值以及泛型等方面提供了完整的类型系统。

五、多线程(Multithreading)

Java 内置多线程支持,能够通过 Thread、Runnable 及其他并发 API 实现并发程序。这是 Java 开发服务器程序、处理并发请求及后台任务的重要技术基础。

六、健壮性和安全性

Java 通过多种语言和运行时机制提高程序的可靠性与安全性,包括:

  • 编译时类型检查;
  • 数组边界检查;
  • 异常处理机制;
  • 自动内存管理;
  • 字节码验证;
  • 不提供 C 语言那样直接进行任意指针运算的能力。

这些机制能够降低部分常见错误发生的风险,但并不意味着 Java 程序天然不会出现安全漏洞。



1.2 - Java 平台

Java 平台(Java Platform)是一个用于开发、编译、运行 Java 程序的软件环境与技术体系。

从基础架构来看,Java 平台主要由 JVM、Java API、JRE 和 JDK 等部分构成。其中,JVM 和 Java API 是 Java 平台运行机制的核心,而 JRE 和 JDK 则分别面向程序运行与程序开发。

1.2.1 - Java 平台的组成部分

image.png

(注:从 Java 9 起,Java 类库和扩展库已经没有明确界限,它们共同构成 Java API)

JVM(Java 虚拟机)

JVM(Java Virtual Machine)是执行 Java 字节码的虚拟机,也是 Java 实现跨平台运行的重要基础。

JVM 的主要职责包括:

  • 类加载(Class Loading):将类的字节码加载到 JVM 中。
  • 字节码执行(Bytecode Execution):通过解释执行、即时编译器(JIT)等机制执行字节码。
  • 运行时内存管理(Runtime Memory Management):管理堆、Java 虚拟机栈等运行时数据区域。
  • 垃圾回收(Garbage Collection):自动回收不再可达的对象所占用的堆内存。

Java API

Java API 是 Java 平台提供的一系列标准类库和接口,为程序开发提供常用功能。

Java API(Java 应用程序编程接口)是一套“规范”,它告诉你可以调用那些类、方法,传入什么参数,会返回什么结果;其具体实现称为 Java 标准类库(Java Class Libraries),标准类库中是已经打包好的 .class 文件和 .jar 包。

例如,常见的 Java SE API 有:

包名主要功能
java.lang核心语言支持,如 String、Object、Math
java.util集合框架、工具类等
java.io传统输入输出操作
java.nio缓冲区、通道、文件操作等
java.net网络通信
java.time日期与时间处理
java.util.concurrent并发编程工具

JRE(Java 运行环境)

JRE(Java Runtime Environment)是运行 Java 程序所需的软件环境。

JRE 包括了:

  • JVM;
  • Java API(或者说标准类库);
  • 其他运行时支持组件。

JRE 的主要目标是运行 Java 程序,而不是开发 Java 程序。

JDK(Java 开发工具包)

JDK(Java Development Toolkit) 为 Java 开发者提供了编写、编译、调试、打包和运行 Java 程序的能力。它是整个 Java 核心中最大的一个集合,包含了 JRE,以及所有开发工具。

开发工具(Tools For Developing Applications)包括了一系列命令行工具(在 JDK 的 bin 目录下),例如:

工具名称核心功能具体作用描述
javac编译器将 .java 源代码编译成 JVM 可执行的 .class 字节码文件。
java启动器运行编译好的 Java 程序(属于 JRE 范畴)。
javadoc文档生成器提取代码注释,生成标准的 HTML API 文档。
jar打包工具将多个 .class 文件打包成 .jar 压缩包,方便发布和引用。
jps / jstack / jconsole监控与排错工具包含查看进程、打印线程堆栈、可视化监控 JVM 性能等调试工具。

因为 JRE 包含在 JDK 中,所以在现代 Java 开发中,通常只需要安装 JDK,无需另外安装 JRE。

1.2.2 - Java 平台的不同版本

Java 平台体系有三个主要方向,它们都包含 JVM 和一套应用程序编程接口(API):

版本说明主要应用
Java SE(Standard Edition)Java 标准版,提供语言基础与核心类库通用程序开发、桌面应用、后端开发基础
Jakarta EE(原 Java EE)面向企业级应用的规范体系企业级 Web 应用、分布式业务系统
Java ME(Micro Edition)面向资源受限设备的 Java 技术体系部分嵌入式设备等

image.png

其中,Java SE 是学习 Java 的基础。Java SE 涵盖 Java 语言本身及其标准 API,例如面向对象、字符串、异常处理、集合框架、泛型、输入输出以及多线程基础等。



1.3 - Java 开发环境

Java 开发环境(Java Development Environment)是指开发 Java 程序所需的软件工具、运行环境及相关配置。

对于 Java SE,最基本的开发环境就是 JDK(Java Development Kit)+ 代码编辑工具。开发者通过 JDK 提供的编译器、运行工具等完成 Java 程序的编译与执行,并通常借助集成开发环境(IDE)提高开发效率。

1.3.1 - Java 开发环境的基本组成

组成部分主要作用是否必需
JDK提供 Java 编译器、运行环境及开发工具必需
IDE / 代码编辑器编写、调试和管理 Java 程序非必需
环境变量使终端及其他工具能够定位 JDK不配置无法在命令行全局使用
构建工具自动化依赖管理、编译、测试和打包简单程序不需要

关于 JDK 的版本和发行版:

  • JDK 版本的选择:Java 有很多版本,其中部分版本是长期支持版本 LTS(如 Java 8、Java 17、Java 21等),对于 Java SE 的学习,可以直接使用最新的 LTS 版本的 JDK;
  • JDK 发行版的选择:JDK 并非只有 Oracle 提供的官方版本,因为 Java 的核心源码(OpenJDK)是开源的,任何组织都可基于 OpenJDK 编译打包自己的“发行版”,它们在许可证、商业支持、平台优化等方面各有侧重。对于个人学习可使用 Eclipse Temurin 或 Oracle JDK。

关于 IDE(集成开发环境)的选择:

你可以使用记事本编写 Java 程序(值得尝试),但 IDE 无疑会带来更拟人的编程体验。

而 JetBrains 的 IntelliJ IDEA 无疑是 Java IDE 中的王者,它功能完整,具备非常丰富、易用的代码补全、重构、调试和项目管理等功能。如果你需要一个更轻量的选择,VSCode 当然也没问题。JetBrains 提供了官方的扩展插件,可在 VSCode 上提供 IDEA 的部分功能。


1.3.2 - Windows 系统开发环境配置

一、安装 JDK

如果你不想自己安装和配置 JDK,并且决定使用 IntelliJ IDEA,可以后续在 IDEA 中安装 JDK,IDEA 可以帮助你完成这些操作。

[Eclipse Temurin - 基于 OpenJDK,免费、应用广泛的 JDK 发行版]
https://adoptium.net/

[Eclipse Temurin - Oracle 官方发行版]
https://www.oracle.com/java/technologies/downloads/

不出意外的话,下载好镜像或安装程序后,启动并一路点击下一步即可。建议直接安装到默认路径,除非你不想在 C 盘安装任何软件。JDK 目录通常包含以下内容:

jdk-25/
├── bin/        # Java 所有的命令行工具都在 bin 文件夹中
├── conf/       # 配置文件
├── include/    # 本地方法接口相关头文件
├── jmods/      # Java 模块文件
├── legal/      # 许可及法律声明
├── lib/        # JDK 内部使用的文件
└── release     # JDK 版本等信息

二 、配置环境变量

部分 JDK 安装程序可能会自动配置。

  1. JAVA_HOME:新建系统变量,值为 JDK 安装目录(例如 C:\Program Files\Java\jdk-25);

  2. Path:在 Path 中追加 %JAVA_HOME%\bin;

  3. CLASSPATH:一般无需手动配置。

配置完成后可以在命令行中使用 java -version 和 javac -version 验证:

image.png

三、安装 IntelliJ IDEA

对于 Java SE 和后端开发,推荐使用 IntelliJ IDEA,下载地址:

[Download IntelliJ IDEA]
https://www.jetbrains.com/idea/download/

按照安装程序的提示操作即可,可以在安装时选择让 IDEA 与 .java、.kt 等扩展名的文件相关联,之后打开 .java 等类型的文件可直接启动 IDEA。



1.4 - 第一个 Java 程序

在配置好 JDK 和 IntelliJ IDEA 后,就可以开始编写第一个 Java 程序。

这个部分会解决三个问题:

  • 一个 Java 程序由哪些部分组成?
  • Java 源代码是如何被编译和运行的?
  • 如果分别通过命令行和 IDE 编译和运行一个 Java 程序?

1.4.1 - Java 程序的结构

这是一个最简单的 Java 程序,其功能实在控制台输出 “Hello, World!”:

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}

【第 1 行】 public class HelloWorld :

  • public(访问修饰符):告诉编辑器对该类的访问权限,也可以是 private 或 protected;
  • class(关键字):此关键字用于声明类,之后紧跟类的类名(HelloWorld)。类是 Java 程序组织代码的重要单位,可以包含变量、函数等成员。

【第 2 行】 public static void main(String[] args) :

  • static(关键字):声明该方法是静态方法(以后讲解);
  • void(关键字):声明该方法不返回任何值,与 C 语言一致;
  • main(方法名):main 方法是传统 Java 应用程序的入口方法。启动程序时,会自动调用符合要求的 main 方法;
  • String[] args(参数):用于接收命令行参数;

【第 3 行】 System.out.println("Hello, World!"); :

  • 该语句调用标准输出流的方法,将指定的字符串输出到控制台,并换行;
  • println 里的 ln 是 line 的缩写,所以是输出一行的意思;也存在一个 print 方法,唯一的区别是不会在末尾追加换行。

一个 Java 源文件的逻辑结构:

Java 源文件(.java)
│
├── package 声明(可选)
├── import 声明(可选)
│
└── 顶层类型声明
    └── class HelloWorld
        ├── 字段(可选)
        ├── 构造器(可选)
        └── 方法
            └── main()
                └── 可执行语句

值得特别注意:

  • Java 是大小写敏感的;
  • 源文件名必须与类名相同(比如,例子中程序的源文件名必须为 HelloWorld.java)。

1.4.2 - 在命令行中编译并运行 Java 程序

一、编译并运行一个 Java 程序

Java 开发并不依赖 IntelliJ IDEA 等集成开发环境,我们之前提到:只要安装了 JDK,就可以使用文本编辑器编写 Java 源文件,然后通过命令行完成编译和运行。

  1. 编译 Java 源代码:在源文件所在目录打开 PowerShell 或 CMD,执行 javac [文件名] 命令。

    $ javac HelloWorld.java
  2. 若编译成功,通常不会输出任何信息,但目录中会增加一个 .class 文件。这是是编译后的类文件,内部存储的是供 JVM 执行的字节码及相关元数据。

    D:\JavaStudy\HelloWorld\
    ├── HelloWorld.java
    └── HelloWorld.class
  3. 运行 Java 程序:编译成功后,在同一目录执行 java [类名] 命令。

    $ javac HelloWorld.java
    $ java HelloWorld
    Hello, World!
    $

二、直接运行 Java 源文件

对于简单的程序,可以使用 java [文件名] 命令(例如 java HelloWorld.java),直接启动源文件形式的 Java 程序(但这并不意味着 Java 不再需要编译,而是 Java 启动器会在内部完成所需的编译和执行步骤)。

三、传递命令行参数

前面提到,main 方法中的 String[] args 用于接收命令行参数。这一机制与 C 语言中通过 main(int argc, char *argv[]) 接收命令行参数有相似之处,但 Java 直接提供了字符串数组,参数数量可以通过 args.length 获取。

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, " + args[0]);
    }
}

编译并运行(在运行时传入一个参数 Duguiyu,它会作为一个字符串存储在 args[0] 中):

$ javac HelloWorld.java
$ java HelloWorld Duguiyu
Hello, Duguiyu
$

1.4.3 - 在 IntelliJ IDEA 中编写 Java 程序

相较于手动执行 javac 和 java,IDEA 可以自动完成许多重复操作,但底层仍然需要使用 JDK 提供的编译与运行能力。

一、创建一个 Java 项目

打开 IntelliJ IDEA,在欢迎界面选择 New Project。IDEA 会自动识别已经安装好的 JDK,也提供直接下载和配置的选项。

image.png

二、IDEA 的项目结构

创建项目后,IDEA 会自动生成项目目录及配置文件,一个简单的项目可能具有如下结构:

HelloWorld/
├── .idea/               # IDEA 项目配置
├── src/                 # 源代码目录
│   └── HelloWorld.java  # Java 源代码
├── out/                 # 编译输出目录(编译后出现)
└── HelloWorld.iml       # 模块配置文件(视版本和设置)
  • Project(项目):是 IDEA 管理代码、模块、依赖、构建设置及运行配置的工作单位;
  • Module(模块):是项目中的一个逻辑组织单位,可以具有自己的源代码目录、依赖及 SDK 配置。简单 Java 项目通常只需要一个模块;
  • Source Root(源代码根目录):是用于存放源代码的目录,通常是 src,IDEA 会将其识别为 Java 源代码目录。src 是常见的项目目录约定,不是 Java 语言强制要求的目录名称。

三、创建 Java 类

QQ_1794294483910.png

可以在 src 目录中,右键选择 New → Java Class 创建一个类,IDEA 会自动创建 .java 文件,包含类的基本结构。

public class HelloWorld {
 
}

四、运行和调试程序

IDEA 中点击 Run,本质上相当于替开发者完成构建并启动 Java 程序的过程。

IDEA 一般会将编译生成的 .class 文件放在配置的输出目录(例如 out/production/HelloWorld/),而不一定与 .java 文件存放在一起。

image.png

除了直接运行,IDEA 还支持调试(Debugging)。调试是指在程序运行过程中暂停执行、检查变量、逐步执行语句,以定位程序错误的过程。

例如以下代码,可在第 6 行左侧单击左键,设置一个断电(Breakpoint),然后选择调试运行,程序在执行到断点时就会暂停,此时可以观察变量的值,并逐步执行程序。

public class HelloWorld {
    public static void main(String[] args) {
        int a = 10;
        int b = 20;
 
        int sum = a + b;
        System.out.println(sum);
    }
}

QQ_1794294964270.png



1.5 - Java 代码规范

代码规范是指是指在编写程序时,开发者共同遵循的一系列命名、排版、注释和编码约定,目的是让程序更容易阅读、理解、维护和协作开发。

Java 并不存在一套所有项目都必须遵守的统一代码风格,目前值得参考的规范包括 Google Java Style Guide 以及 Oracle 的 Java 命名约定。

[Google Java Style Guide]
https://google.github.io/styleguide/javaguide.html