Java 从零开始完全入门指南

本文适合完全没有 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

根据操作系统选择对应版本:

操作系统推荐安装包
Windowsjdk-21_windows-x64_bin.exe
macOS (M芯片)jdk-21_macos-aarch64_bin.dmg
Linuxjdk-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 创建项目

  1. 打开 IDEA → New Project
  2. 选择 Java,JDK 选择刚安装的 21
  3. 项目名填 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 种)

类型大小范围示例
byte1 字节-128 ~ 127byte b = 100;
short2 字节-32768 ~ 32767short s = 1000;
int4 字节-21亿 ~ 21亿int n = 42;
long8 字节极大范围long l = 100L;
float4 字节单精度浮点float f = 3.14f;
double8 字节双精度浮点double d = 3.14;
char2 字节单个 Unicode 字符char c = 'A';
boolean1 字节true / falseboolean 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 是基本类型,性能更好,不能为 null
  • Integer 是包装类型,可以为 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
面向对象类、对象、构造方法、封装继承多态
常用 APIString、ArrayList、HashMap
异常处理try-catch-finally、throw/throws
构建工具Maven pom.xml 与常用命令

© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容