引言

Java作为一种广泛使用的编程语言,以其稳定性、跨平台性和丰富的生态系统在企业级应用、Android开发和大数据领域占据重要地位。本指南旨在帮助开发者系统复习Java核心知识,从基础语法入手,逐步深入到高级特性,并结合实战技巧提供实用指导。无论你是准备面试、项目开发还是技能提升,本指南都将提供详细解释和完整示例,确保内容通俗易懂、逻辑清晰。

Java的核心优势在于其“一次编写,到处运行”的理念,通过Java虚拟机(JVM)实现跨平台。复习时,我们应关注语法基础、面向对象编程、集合框架、多线程、异常处理、I/O操作、高级特性(如Lambda和Stream API)以及性能优化等关键点。下面,我们将逐一展开这些主题,每个部分包含主题句、支持细节和实战示例。

1. 基础语法:Java程序的基石

基础语法是Java编程的起点,它定义了代码的结构和执行方式。Java是静态类型语言,要求在编译时声明变量类型,这有助于减少运行时错误。复习时,重点掌握变量、数据类型、运算符、控制流语句和基本输入输出。

1.1 变量与数据类型

Java的数据类型分为基本类型(primitive types)和引用类型(reference types)。基本类型包括整型(byte, short, int, long)、浮点型(float, double)、字符型(char)和布尔型(boolean)。引用类型包括类、接口、数组等。

主题句:正确声明和初始化变量是编写可靠Java代码的第一步。

支持细节

  • 变量声明格式:数据类型 变量名 = 初始值;
  • 常量使用final关键字:final int MAX_VALUE = 100;
  • 类型转换:自动转换(小到大)和强制转换(大到小,可能丢失精度)。

示例:以下代码演示变量声明、类型转换和常量使用。

public class VariableDemo {
    public static void main(String[] args) {
        // 基本类型变量声明
        int age = 25;  // 整型
        double salary = 5000.50;  // 双精度浮点型
        char grade = 'A';  // 字符型
        boolean isEmployed = true;  // 布尔型

        // 常量
        final double PI = 3.14159;

        // 类型转换
        int smallNum = 100;
        byte byteNum = (byte) smallNum;  // 强制转换,可能溢出
        double doubleNum = smallNum;     // 自动转换

        System.out.println("年龄: " + age);
        System.out.println("PI值: " + PI);
        System.out.println("字节值: " + byteNum);
    }
}

输出

年龄: 25
PI值: 3.14159
字节值: 100

这个示例展示了如何在控制台输出变量值,帮助调试和验证。

1.2 运算符与控制流

Java支持算术、关系、逻辑、位和赋值运算符。控制流语句包括条件语句(if-else, switch)和循环语句(for, while, do-while)。

主题句:运算符和控制流是实现逻辑判断和重复操作的核心工具。

支持细节

  • 算术运算符:+, -, *, /, %(模运算)。
  • 逻辑运算符:&&(短路与), ||(短路或), !(非)。
  • switch语句支持String类型(Java 7+),但需注意break防止穿透。

示例:使用if-else和for循环计算1到100的偶数和。

public class ControlFlowDemo {
    public static void main(String[] args) {
        int sum = 0;
        for (int i = 1; i <= 100; i++) {
            if (i % 2 == 0) {  // 判断偶数
                sum += i;
            }
        }
        System.out.println("1到100的偶数和: " + sum);

        // switch示例
        String day = "Monday";
        switch (day) {
            case "Monday":
                System.out.println("新的一周开始!");
                break;
            case "Friday":
                System.out.println("周末快到了!");
                break;
            default:
                System.out.println("普通日子");
        }
    }
}

输出

1到100的偶数和: 2550
新的一周开始!

实战技巧:在循环中使用breakcontinue优化性能,避免不必要的迭代。始终使用大括号{}包围代码块,即使只有一行,以防维护时出错。

2. 面向对象编程(OOP):Java的核心范式

Java是纯面向对象语言,一切皆对象。OOP的四大支柱是封装、继承、多态和抽象。复习时,重点理解类与对象、构造函数、方法重载/重写、接口和抽象类。

2.1 类与对象、封装

主题句:封装通过访问修饰符隐藏内部实现细节,提高代码安全性。

支持细节

  • 访问修饰符:private(私有), protected(受保护), public(公共), 默认(包级)。
  • Getter/Setter方法用于访问私有字段。
  • 构造函数:用于初始化对象,支持重载。

示例:定义一个Person类,演示封装和构造函数。

class Person {
    private String name;  // 私有字段
    private int age;

    // 构造函数
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // Getter和Setter
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if (age > 0) {  // 业务逻辑验证
            this.age = age;
        }
    }

    // 方法
    public void introduce() {
        System.out.println("我叫" + name + ",今年" + age + "岁。");
    }
}

public class OOPDemo {
    public static void main(String[] args) {
        Person person = new Person("Alice", 30);
        person.introduce();
        person.setAge(31);
        System.out.println("更新后年龄: " + person.getAge());
    }
}

输出

我叫Alice,今年30岁。
更新后年龄: 31

实战技巧:使用this关键字区分成员变量和参数。始终验证Setter输入,防止无效数据。

2.2 继承、多态与接口

主题句:继承允许子类复用父类代码,多态通过方法重写实现动态行为。

支持细节

  • 使用extends实现单继承(Java不支持多继承,但可通过接口模拟)。
  • 接口(interface)定义契约,支持多实现(implements)。
  • 抽象类(abstract)包含抽象方法,必须由子类实现。

示例:动物继承体系,演示多态。

abstract class Animal {  // 抽象类
    abstract void makeSound();  // 抽象方法
}

class Dog extends Animal {
    @Override
    void makeSound() {
        System.out.println("汪汪!");
    }
}

class Cat extends Animal {
    @Override
    void makeSound() {
        System.out.println("喵喵!");
    }
}

interface Flyable {  // 接口
    void fly();
}

class Bird extends Animal implements Flyable {
    @Override
    void makeSound() {
        System.out.println("叽叽!");
    }

    @Override
    public void fly() {
        System.out.println("鸟儿在飞!");
    }
}

public class InheritanceDemo {
    public static void main(String[] args) {
        Animal[] animals = {new Dog(), new Cat(), new Bird()};
        for (Animal animal : animals) {
            animal.makeSound();  // 多态:同一引用类型,不同行为
            if (animal instanceof Flyable) {
                ((Flyable) animal).fly();  // 类型检查和转换
            }
        }
    }
}

输出

汪汪!
喵喵!
叽叽!
鸟儿在飞!

实战技巧:优先使用组合而非继承,避免继承链过长。使用@Override注解确保正确重写,编译器会检查。

3. 异常处理:确保程序健壮性

异常处理是Java处理错误和异常情况的机制。复习时,掌握Checked/Unchecked异常、try-catch-finally和自定义异常。

3.1 异常类型与处理

主题句:异常处理防止程序崩溃,提供优雅的错误恢复。

支持细节

  • Checked异常(如IOException)必须处理或声明抛出。
  • Unchecked异常(如NullPointerException)是RuntimeException子类。
  • finally块总是执行,用于资源清理。

示例:处理文件读取异常。

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class ExceptionDemo {
    public static void main(String[] args) {
        BufferedReader reader = null;
        try {
            reader = new BufferedReader(new FileReader("nonexistent.txt"));
            String line = reader.readLine();
            System.out.println(line);
        } catch (IOException e) {
            System.err.println("文件读取错误: " + e.getMessage());
        } finally {
            if (reader != null) {
                try {
                    reader.close();  // 资源清理
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

输出(假设文件不存在):

文件读取错误: nonexistent.txt (系统找不到指定的文件。)

实战技巧:Java 7+使用try-with-resources自动关闭资源:try (BufferedReader reader = new BufferedReader(...)) { ... }。自定义异常继承Exception或RuntimeException。

4. 集合框架:高效数据管理

Java集合框架(Collections Framework)提供List、Set、Map等接口和实现类,用于存储和操作数据。

4.1 主要接口与类

主题句:选择合适的集合类型优化性能和功能。

支持细节

  • List:有序可重复,如ArrayList(动态数组)、LinkedList(链表)。
  • Set:无序不可重复,如HashSet(哈希)、TreeSet(排序)。
  • Map:键值对,如HashMap(哈希)、TreeMap(排序)。
  • 使用泛型<T>确保类型安全。

示例:使用ArrayList和HashMap。

import java.util.*;

public class CollectionDemo {
    public static void main(String[] args) {
        // List示例
        List<String> fruits = new ArrayList<>();
        fruits.add("Apple");
        fruits.add("Banana");
        fruits.add("Apple");  // 可重复
        System.out.println("List: " + fruits);

        // Set示例
        Set<String> uniqueFruits = new HashSet<>(fruits);
        System.out.println("Set: " + uniqueFruits);  // 去重

        // Map示例
        Map<String, Integer> fruitPrices = new HashMap<>();
        fruitPrices.put("Apple", 5);
        fruitPrices.put("Banana", 3);
        System.out.println("Map: " + fruitPrices);
        System.out.println("Apple价格: " + fruitPrices.get("Apple"));
    }
}

输出

List: [Apple, Banana, Apple]
Set: [Banana, Apple]
Map: {Apple=5, Banana=3}
Apple价格: 5

实战技巧:ArrayList适合随机访问,LinkedList适合频繁插入/删除。使用Collections.sort()排序List,或TreeMap自动排序Map。

5. 多线程与并发:处理并行任务

Java通过Thread类和Runnable接口支持多线程。复习时,理解线程生命周期、同步机制和高级并发工具(如ExecutorService)。

5.1 创建线程与同步

主题句:多线程提高程序效率,但需处理共享资源竞争。

支持细节

  • 线程状态:NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED。
  • 同步:使用synchronized关键字或Lock接口防止数据不一致。
  • 避免死锁:按固定顺序获取锁。

示例:使用Runnable创建线程,演示同步。

class Counter {
    private int count = 0;
    private final Object lock = new Object();

    public void increment() {
        synchronized (lock) {  // 同步块
            count++;
        }
    }

    public int getCount() {
        return count;
    }
}

public class ThreadDemo {
    public static void main(String[] args) throws InterruptedException {
        Counter counter = new Counter();
        Thread t1 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) counter.increment();
        });
        Thread t2 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) counter.increment();
        });

        t1.start();
        t2.start();
        t1.join();  // 等待线程结束
        t2.join();

        System.out.println("最终计数: " + counter.getCount());  // 应为2000
    }
}

输出

最终计数: 2000

实战技巧:使用ExecutorService管理线程池:ExecutorService executor = Executors.newFixedThreadPool(5); executor.submit(task);。Java 5+的java.util.concurrent包提供ConcurrentHashMap等线程安全集合。

6. I/O操作:文件与流处理

Java I/O基于流(Stream)模型,复习字节流(InputStream/OutputStream)和字符流(Reader/Writer),以及NIO(New I/O)。

6.1 字节流与字符流

主题句:I/O流用于读写数据,字节流处理二进制,字符流处理文本。

支持细节

  • 装饰器模式:如BufferedReader包装FileReader提高效率。
  • NIO提供Channel和Buffer,支持非阻塞I/O。

示例:复制文件使用缓冲流。

import java.io.*;

public class IODemo {
    public static void main(String[] args) {
        try (BufferedReader reader = new BufferedReader(new FileReader("input.txt"));
             BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"))) {
            String line;
            while ((line = reader.readLine()) != null) {
                writer.write(line);
                writer.newLine();
            }
            System.out.println("文件复制完成!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

实战技巧:始终使用缓冲流减少磁盘I/O。NIO适合大文件或网络编程:FileChannel channel = FileChannel.open(Paths.get("file.txt"), StandardOpenOption.READ);

7. 高级特性:Java 8+的现代编程

Java 8引入Lambda表达式、Stream API等,提高代码简洁性和函数式编程能力。复习时,掌握Optional、日期时间API(java.time)和模块化(Java 9+)。

7.1 Lambda表达式与Stream API

主题句:Lambda简化匿名内部类,Stream提供声明式数据处理。

支持细节

  • Lambda格式:(参数) -> { 表达式 }
  • Stream操作:filter, map, reduce, collect。
  • Optional避免NullPointerException。

示例:使用Stream处理列表。

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class AdvancedDemo {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);

        // Lambda和Stream
        List<Integer> evenSquares = numbers.stream()
                .filter(n -> n % 2 == 0)  // 过滤偶数
                .map(n -> n * n)          // 平方
                .collect(Collectors.toList());  // 收集

        System.out.println("偶数平方: " + evenSquares);

        // Optional示例
        String maybeNull = null;
        Optional<String> opt = Optional.ofNullable(maybeNull);
        System.out.println("Optional值: " + opt.orElse("默认值"));
    }
}

输出

偶数平方: [4, 16, 36]
Optional值: 默认值

实战技巧:Stream是惰性的,只有终端操作(如collect)才执行。使用并行Stream(stream().parallel())处理大数据,但注意线程安全。

7.2 日期时间API与模块化

主题句:java.time包提供线程安全的日期处理,模块化提高可维护性。

支持细节

  • LocalDate, LocalTime, LocalDateTime。
  • Java 9模块系统:module-info.java定义模块依赖。

示例:日期操作。

import java.time.LocalDate;
import java.time.Period;

public class DateDemo {
    public static void main(String[] args) {
        LocalDate today = LocalDate.now();
        LocalDate birthday = LocalDate.of(1990, 1, 1);
        Period age = Period.between(birthday, today);
        System.out.println("年龄: " + age.getYears() + "岁");
    }
}

输出

年龄: 34岁  // 假设当前2024年

8. 实战技巧与最佳实践

8.1 性能优化

  • 避免创建过多对象:使用对象池或String.intern()。
  • 垃圾回收:理解JVM调优,如使用-XX:+UseG1GC。
  • 代码规范:遵循命名约定,使用注解(如@Override)。

8.2 调试与测试

  • 使用IDE调试器设置断点。
  • 单元测试:JUnit框架,示例:@Test public void testAdd() { assertEquals(2, 1+1); }
  • 日志:SLF4J + Logback。

8.3 常见陷阱与解决方案

  • 空指针:使用Optional或null检查。
  • 并发问题:优先使用java.util.concurrent。
  • 版本兼容:使用Maven/Gradle管理依赖。

主题句:实战技巧将理论转化为生产力,帮助你在项目中高效应用Java。

通过本指南的系统复习,你应该能全面掌握Java核心知识点。建议结合实际项目练习,如构建一个简单的Web应用(使用Spring Boot)或Android App,以加深理解。持续学习最新Java版本(如Java 21的虚拟线程)将保持你的竞争力。如果需要特定主题的深入扩展,请提供更多细节!