本文适合完全没有 Java 基础的读者,从环境搭建到写出第一个程序,手把手带你入门。
技术栈:Java 21 LTS · JDK · IntelliJ IDEA · Maven
一、Java 是什么?为什么学 Java?
Java 是由 Sun Microsystems(现 Oracle)于 1995 年推出的面向对象、跨平台编程语言。
Java 的核心特点
| 特性 | 说明 |
|---|---|
| 跨平台 | 一次编写,到处运行(Write Once, Run Anywhere) |
| 面向对象 | 一切皆对象,高度抽象与复用 |
| 强类型 | 编译期类型检查,减少运行时错误 |
| 自动内存管理 | GC 垃圾回收,无需手动 malloc/free |
| 生态成熟 | Spring、Kafka、Hadoop 等大量框架 |
Java 能做什么?
Java 应用场景
├── 后端开发 → Spring Boot / Spring Cloud 微服务
├── Android 开发 → 安卓原生应用
├── 大数据 → Hadoop / Spark / Flink
├── 中间件 → Kafka / Elasticsearch / ZooKeeper
└── 企业系统 → ERP / CRM / OA 系统
一句话总结:Java 是世界上使用最广泛的编程语言之一(TIOBE 常年前三),在后端开发、大数据领域是绝对主流。
二、安装 JDK 开发环境
2.1 下载 JDK 21
推荐使用 JDK 21(当前 LTS 长期支持版本)。
方式一:官方下载(推荐)
https://www.oracle.com/java/technologies/downloads/#java21
根据操作系统选择对应版本:
| 操作系统 | 推荐安装包 |
|---|---|
| Windows | jdk-21_windows-x64_bin.exe |
| macOS (M芯片) | jdk-21_macos-aarch64_bin.dmg |
| Linux | jdk-21_linux-x64_bin.tar.gz |
方式二:使用 Adoptium(免费开源)
https://adoptium.net/
2.2 配置环境变量(Windows)
安装完成后,配置系统环境变量:
# 1. 新建系统变量
变量名:JAVA_HOME
变量值:C:\Program Files\Java\jdk-21
# 2. 在 Path 中追加
%JAVA_HOME%\bin
2.3 验证安装
打开终端(CMD / PowerShell / Terminal),执行:
java -version
看到如下输出表示安装成功:
java version "21.0.3" 2024-04-16 LTS
Java(TM) SE Runtime Environment (build 21.0.3+7-LTS-152)
Java HotSpot(TM) 64-Bit Server VM (build 21.0.3+7-LTS-152, mixed mode, sharing)
2.4 安装 IntelliJ IDEA(推荐 IDE)
https://www.jetbrains.com/idea/download/
选择 Community Edition(社区版,免费) 即可满足学习需求。
三、Hello World:第一个 Java 程序
3.1 创建项目
- 打开 IDEA →
New Project - 选择
Java,JDK 选择刚安装的 21 - 项目名填
hello-java,点击Create
3.2 编写代码
在 src 目录下新建文件 HelloWorld.java:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
System.out.println("欢迎来到 Java 的世界!");
}
}
3.3 运行
点击左侧绿色三角 ▶ 按钮,或使用快捷键 Shift + F10。
控制台输出:
Hello, World!
欢迎来到 Java 的世界!
3.4 代码解析
public class HelloWorld { // 声明一个公开类,类名必须与文件名相同
public static void main(String[] args) { // 程序入口方法(固定写法)
System.out.println("Hello, World!"); // 打印一行并换行
}
}
注意:Java 文件名必须与
public class的类名完全一致,否则编译报错。
四、Java 基础语法
4.1 变量与数据类型
Java 是强类型语言,声明变量时必须指定类型。
基本数据类型(8 种)
| 类型 | 大小 | 范围 | 示例 |
|---|---|---|---|
byte | 1 字节 | -128 ~ 127 | byte b = 100; |
short | 2 字节 | -32768 ~ 32767 | short s = 1000; |
int | 4 字节 | -21亿 ~ 21亿 | int n = 42; |
long | 8 字节 | 极大范围 | long l = 100L; |
float | 4 字节 | 单精度浮点 | float f = 3.14f; |
double | 8 字节 | 双精度浮点 | double d = 3.14; |
char | 2 字节 | 单个 Unicode 字符 | char c = 'A'; |
boolean | 1 字节 | true / false | boolean ok = true; |
引用类型
String name = "黎生"; // 字符串
int[] scores = {90, 85, 92}; // 数组
代码示例
public class Variables {
public static void main(String[] args) {
// 整数
int age = 25;
long population = 1_400_000_000L; // 下划线增加可读性
// 浮点数
double price = 99.99;
float rate = 0.85f; // float 必须加 f 后缀
// 字符与布尔
char grade = 'A';
boolean isPassed = true;
// 字符串
String name = "Java 学习者";
// 自动类型推断(Java 10+)
var list = new java.util.ArrayList<String>();
System.out.println("姓名:" + name + ",年龄:" + age);
}
}
4.2 运算符
// 算术运算符
int a = 10, b = 3;
System.out.println(a + b); // 13 加
System.out.println(a - b); // 7 减
System.out.println(a * b); // 30 乘
System.out.println(a / b); // 3 整数除法(舍去小数)
System.out.println(a % b); // 1 取余
System.out.println((double) a / b); // 3.333... 强制转换后再除
// 比较运算符(返回 boolean)
System.out.println(a > b); // true
System.out.println(a == b); // false
System.out.println(a != b); // true
// 逻辑运算符
boolean x = true, y = false;
System.out.println(x && y); // false 与
System.out.println(x || y); // true 或
System.out.println(!x); // false 非
// 字符串拼接
String s = "Hello" + " " + "World"; // "Hello World"
4.3 流程控制
if-else 条件判断
int score = 85;
if (score >= 90) {
System.out.println("优秀");
} else if (score >= 70) {
System.out.println("良好");
} else if (score >= 60) {
System.out.println("及格");
} else {
System.out.println("不及格");
}
switch 多分支(Java 14+ 新语法)
String day = "Monday";
// 传统写法
switch (day) {
case "Monday":
case "Tuesday":
System.out.println("工作日");
break;
case "Saturday":
case "Sunday":
System.out.println("周末");
break;
default:
System.out.println("其他");
}
// Java 14+ 箭头语法(更简洁)
String result = switch (day) {
case "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" -> "工作日";
case "Saturday", "Sunday" -> "周末";
default -> "未知";
};
for 循环
// 基础 for 循环
for (int i = 0; i < 5; i++) {
System.out.println("第 " + (i + 1) + " 次循环");
}
// 增强 for 循环(遍历数组/集合)
int[] numbers = {1, 2, 3, 4, 5};
for (int num : numbers) {
System.out.println(num);
}
// 求 1~100 的和
int sum = 0;
for (int i = 1; i <= 100; i++) {
sum += i;
}
System.out.println("1+2+...+100 = " + sum); // 5050
while / do-while 循环
// while:先判断,再执行
int n = 1;
while (n <= 5) {
System.out.println("while: " + n);
n++;
}
// do-while:先执行一次,再判断
int m = 1;
do {
System.out.println("do-while: " + m);
m++;
} while (m <= 5);
五、面向对象基础
5.1 类与对象
类是模板,对象是实例。就像”汽车设计图”(类)和”一辆具体的汽车”(对象)。
// 定义类
public class Dog {
// 属性(成员变量)
String name;
int age;
String breed;
// 方法(行为)
public void bark() {
System.out.println(name + ":汪汪汪!");
}
public void info() {
System.out.println("名字:" + name + ",年龄:" + age + ",品种:" + breed);
}
}
// 使用类创建对象
public class Main {
public static void main(String[] args) {
Dog dog1 = new Dog(); // 创建对象
dog1.name = "小白";
dog1.age = 3;
dog1.breed = "柴犬";
dog1.bark(); // 小白:汪汪汪!
dog1.info();
}
}
5.2 构造方法
构造方法用于创建对象时初始化属性:
public class Person {
String name;
int age;
// 无参构造方法
public Person() {
this.name = "未知";
this.age = 0;
}
// 有参构造方法
public Person(String name, int age) {
this.name = name; // this 指代当前对象
this.age = age;
}
public void introduce() {
System.out.println("我叫 " + name + ",今年 " + age + " 岁。");
}
public static void main(String[] args) {
Person p1 = new Person("黎生", 25);
p1.introduce(); // 我叫 黎生,今年 25 岁。
Person p2 = new Person();
p2.introduce(); // 我叫 未知,今年 0 岁。
}
}
5.3 封装
封装:将数据(属性)私有化,通过公开方法(getter/setter)来访问和修改。
public class BankAccount {
private double balance; // private:只有本类可以访问
public BankAccount(double initialBalance) {
if (initialBalance >= 0) {
this.balance = initialBalance;
}
}
// getter:获取余额
public double getBalance() {
return balance;
}
// 存款
public void deposit(double amount) {
if (amount > 0) {
balance += amount;
System.out.println("存入 " + amount + " 元,当前余额:" + balance);
}
}
// 取款
public void withdraw(double amount) {
if (amount > 0 && amount <= balance) {
balance -= amount;
System.out.println("取出 " + amount + " 元,当前余额:" + balance);
} else {
System.out.println("余额不足!");
}
}
}
5.4 继承
继承:子类继承父类的属性和方法,实现代码复用。
// 父类
public class Animal {
String name;
public Animal(String name) {
this.name = name;
}
public void eat() {
System.out.println(name + " 正在吃东西");
}
}
// 子类继承父类
public class Cat extends Animal {
String color;
public Cat(String name, String color) {
super(name); // 调用父类构造方法
this.color = color;
}
// 重写父类方法
@Override
public void eat() {
System.out.println(name + " 正在优雅地吃猫粮");
}
public void meow() {
System.out.println(name + ":喵~");
}
}
// 使用
Cat cat = new Cat("橘猫", "橘色");
cat.eat(); // 橘猫 正在优雅地吃猫粮(重写后的方法)
cat.meow(); // 橘猫:喵~
5.5 多态
多态:同一个方法在不同对象上有不同的表现。
public class Shape {
public double area() {
return 0;
}
}
public class Circle extends Shape {
double radius;
public Circle(double radius) { this.radius = radius; }
@Override
public double area() {
return Math.PI * radius * radius;
}
}
public class Rectangle extends Shape {
double width, height;
public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}
@Override
public double area() {
return width * height;
}
}
// 多态使用
Shape[] shapes = {
new Circle(5),
new Rectangle(4, 6),
new Circle(3)
};
for (Shape s : shapes) {
System.out.printf("面积:%.2f%n", s.area());
// 自动调用各自的 area() 方法
}
六、常用 API 速查
6.1 String 字符串
String str = "Hello, Java!";
str.length() // 12 获取长度
str.charAt(0) // 'H' 获取指定位置字符
str.indexOf("Java") // 7 查找子串位置(找不到返回 -1)
str.substring(7) // "Java!" 截取子串
str.substring(7, 11) // "Java" 截取区间 [7, 11)
str.toUpperCase() // "HELLO, JAVA!" 转大写
str.toLowerCase() // "hello, java!" 转小写
str.trim() // 去掉首尾空白
str.replace("Java", "World") // "Hello, World!" 替换
str.contains("Java") // true 是否包含
str.startsWith("Hello") // true 是否以指定前缀开头
str.endsWith("!") // true 是否以指定后缀结尾
str.split(", ") // ["Hello", "Java!"] 分割
str.equals("Hello, Java!") // true 内容相等比较(不能用 ==)
str.equalsIgnoreCase("hello, java!") // true 忽略大小写比较
// 字符串格式化
String info = String.format("姓名:%s,年龄:%d,GPA:%.2f", "黎生", 25, 3.85);
6.2 ArrayList 动态数组
import java.util.ArrayList;
ArrayList<String> list = new ArrayList<>();
list.add("Java"); // 添加元素
list.add("Python");
list.add("JavaScript");
list.add(1, "Go"); // 在指定位置插入
list.get(0) // "Java" 获取元素
list.size() // 4 获取大小
list.contains("Python") // true 是否包含
list.remove("Python") // 移除指定元素
list.remove(0) // 移除指定位置元素
list.set(0, "Kotlin") // 修改指定位置元素
list.indexOf("Go") // 获取元素位置
// 遍历
for (String lang : list) {
System.out.println(lang);
}
// Lambda 遍历(Java 8+)
list.forEach(lang -> System.out.println(lang));
6.3 HashMap 键值对
import java.util.HashMap;
HashMap<String, Integer> scores = new HashMap<>();
scores.put("Alice", 92);
scores.put("Bob", 85);
scores.put("Charlie", 78);
scores.get("Alice") // 92 获取值
scores.containsKey("Bob") // true 是否包含键
scores.containsValue(85) // true 是否包含值
scores.size() // 3 获取大小
scores.remove("Charlie") // 移除键值对
scores.getOrDefault("Dave", 0) // 0 获取值,不存在时返回默认值
// 遍历
for (Map.Entry<String, Integer> entry : scores.entrySet()) {
System.out.println(entry.getKey() + ":" + entry.getValue());
}
七、异常处理
Java 使用 try-catch-finally 机制处理异常:
public class ExceptionDemo {
public static void main(String[] args) {
// 基础用法
try {
int result = 10 / 0; // 触发 ArithmeticException
System.out.println(result);
} catch (ArithmeticException e) {
System.out.println("除法错误:" + e.getMessage());
} finally {
System.out.println("finally 块始终会执行");
}
// 捕获多种异常
try {
String s = null;
int[] arr = {1, 2, 3};
s.length(); // NullPointerException
arr[10] = 5; // ArrayIndexOutOfBoundsException
} catch (NullPointerException e) {
System.out.println("空指针异常:" + e.getMessage());
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("数组越界:" + e.getMessage());
} catch (Exception e) { // 兜底:捕获所有异常
System.out.println("其他异常:" + e.getMessage());
}
}
// 声明方法可能抛出异常
public static int divide(int a, int b) throws ArithmeticException {
if (b == 0) {
throw new ArithmeticException("除数不能为零");
}
return a / b;
}
}
常见异常类型速查
| 异常类 | 触发场景 |
|---|---|
NullPointerException | 对 null 对象调用方法或访问属性 |
ArrayIndexOutOfBoundsException | 数组下标越界 |
ClassCastException | 类型强制转换失败 |
NumberFormatException | 字符串转数字格式不正确 |
FileNotFoundException | 文件不存在 |
IOException | 输入/输出操作失败 |
StackOverflowError | 无限递归导致栈溢出 |
八、Maven 项目管理
Maven 是 Java 最流行的构建和依赖管理工具。
8.1 pom.xml 基础结构
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- 项目坐标 -->
<groupId>com.example</groupId>
<artifactId>my-app</artifactId>
<version>1.0.0</version>
<!-- Java 版本配置 -->
<properties>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!-- 依赖管理 -->
<dependencies>
<!-- 示例:添加 Gson(JSON 处理库) -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version>
</dependency>
<!-- 示例:添加 JUnit 5 测试框架 -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.10.0</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
8.2 常用 Maven 命令
mvn compile # 编译源代码
mvn test # 运行测试
mvn package # 打包为 jar/war
mvn clean # 清理构建产物
mvn clean package # 清理并重新打包
mvn install # 安装到本地仓库
mvn dependency:tree # 查看依赖树
九、学习路线图
Java 学习路线
│
├── 阶段一:基础语法(2~3 周)
│ ├── 数据类型、变量、运算符
│ ├── 流程控制(if/for/while/switch)
│ ├── 数组与字符串
│ └── 方法(参数、返回值、重载)
│
├── 阶段二:面向对象(3~4 周)
│ ├── 类与对象、构造方法
│ ├── 封装、继承、多态、抽象类
│ ├── 接口(Interface)
│ └── 内部类、匿名类
│
├── 阶段三:核心 API(2~3 周)
│ ├── 集合框架(List / Map / Set)
│ ├── 泛型
│ ├── 异常处理
│ └── IO / NIO 文件操作
│
├── 阶段四:现代 Java 特性(2 周)
│ ├── Java 8:Lambda、Stream API、Optional
│ ├── Java 11~17:var、记录类、密封类
│ └── Java 21:虚拟线程(Virtual Threads)
│
└── 阶段五:框架与进阶(持续学习)
├── Spring Boot(后端开发核心)
├── MyBatis / JPA(数据库操作)
├── Redis / Kafka(中间件)
└── 并发编程、JVM 调优
推荐学习资源
| 资源 | 说明 |
|---|---|
| 廖雪峰 Java 教程 | 中文系统教程,适合入门 |
| Java 官方文档 | 权威参考文档 |
| Baeldung | 英文教程,实战导向 |
| LeetCode Java 题库 | 算法练习,强化编码能力 |
| Spring 官网 | Spring 系列官方教程 |
十、常见问题 FAQ
Q:Java 和 JavaScript 有什么关系?
没有任何关系,名字相似只是历史营销策略。Java 是面向对象的编译型语言,JavaScript 是脚本语言,两者定位、语法完全不同。
Q:用 int 还是 Integer?
int是基本类型,性能更好,不能为 nullInteger是包装类型,可以为 null,可以用于集合(如List<Integer>)- 一般用
int,需要放入集合或可能为 null 时用Integer
Q:== 和 equals() 有什么区别?
==比较的是内存地址(引用是否指向同一对象)equals()比较的是内容- 字符串、对象比较相等一定要用
equals(),永远不要用==
Q:为什么 main 方法要写 public static void?
public:JVM 需要从外部调用它static:无需创建对象就能调用void:程序入口不需要返回值String[] args:接收命令行参数
Q:Java 程序运行慢吗?
早期 Java 确实比 C/C++ 慢,但现代 JVM 的 JIT(即时编译)技术已大幅优化。对于大多数业务场景,Java 的性能完全满足需求,Spring Boot 应用每秒可处理数万请求。
总结
本文带你完成了 Java 从零入门的完整旅程:
| 章节 | 核心收获 |
|---|---|
| 环境搭建 | JDK 21 安装、IDEA 配置、Hello World |
| 基础语法 | 8 种基本类型、运算符、if/for/while |
| 面向对象 | 类、对象、构造方法、封装继承多态 |
| 常用 API | String、ArrayList、HashMap |
| 异常处理 | try-catch-finally、throw/throws |
| 构建工具 | Maven pom.xml 与常用命令 |














暂无评论内容