1. Java基础核心概念精讲
Java作为一门面向对象的编程语言,其基础概念的理解深度直接影响着开发者的编码能力和问题解决水平。在Java基础部分,我们需要重点掌握以下几个核心概念:
数据类型与变量:Java是强类型语言,所有变量都必须先声明后使用。基本数据类型包括byte(1字节)、short(2字节)、int(4字节)、long(8字节)、float(4字节)、double(8字节)、char(2字节)和boolean(1位)。引用类型则包括类、接口、数组等。
运算符与表达式:Java支持丰富的运算符,包括算术运算符(+ - * / %)、关系运算符(> < >= <= == !=)、逻辑运算符(&& || !)、位运算符(& | ^ ~ << >> >>>)等。特别要注意++i和i++的区别,以及运算符的优先级问题。
流程控制:if-else条件判断、switch-case多分支选择、for/while/do-while循环构成了Java的基本流程控制结构。在Java 5之后增强的for-each循环大大简化了集合遍历操作。
注意:Java中的switch-case从Java 7开始支持String类型,但在实际开发中要注意null值检查,避免NullPointerException。
1.1 面向对象三大特性
面向对象编程(OOP)的三大特性是Java的核心思想:
封装:通过private/protected/public等访问修饰符控制类成员的可见性,隐藏实现细节,只暴露必要的接口。良好的封装可以提高代码的安全性和可维护性。
继承:使用extends关键字实现类继承,子类可以获得父类的非私有属性和方法。Java采用单继承机制,但可以通过接口实现多继承的效果。
多态:包括编译时多态(方法重载)和运行时多态(方法重写)。父类引用指向子类对象时,调用被重写的方法会表现出子类的行为特征。
// 多态示例 class Animal { void makeSound() { System.out.println("Animal sound"); } } class Dog extends Animal { @Override void makeSound() { System.out.println("Bark"); } } public class Main { public static void main(String[] args) { Animal myAnimal = new Dog(); // 多态 myAnimal.makeSound(); // 输出"Bark" } }1.2 异常处理机制
Java的异常处理采用try-catch-finally结构,所有异常都是Throwable类的子类,分为Error(严重错误)和Exception(可处理异常)两大类。常见的RuntimeException包括NullPointerException、ArrayIndexOutOfBoundsException等。
异常处理的最佳实践:
- 不要捕获Exception基类,应该捕获具体的异常类型
- 在finally块中释放资源(如IO流、数据库连接)
- 自定义异常应继承Exception或RuntimeException
- 使用try-with-resources语法简化资源管理(Java 7+)
2. Java环境配置与开发工具
2.1 JDK安装与环境变量配置
Java开发首先需要安装JDK(Java Development Kit),目前主流版本是JDK 8/11/17。安装完成后需要配置以下环境变量:
- JAVA_HOME:指向JDK安装目录,如
C:\Program Files\Java\jdk-17 - PATH:添加
%JAVA_HOME%\bin,使系统能找到java和javac命令 - CLASSPATH:现代Java版本通常不需要设置,但某些旧项目可能需要
验证安装是否成功:
java -version javac -version常见问题:如果出现"不是内部或外部命令"错误,通常是因为PATH配置不正确或未生效。可以尝试重启命令行窗口或系统。
2.2 开发工具选择
- IntelliJ IDEA:目前最流行的Java IDE,提供强大的代码提示、重构和调试功能
- Eclipse:老牌Java IDE,插件生态丰富
- VS Code:轻量级编辑器,通过Java扩展包支持Java开发
- NetBeans:Oracle官方维护的IDE,对Java EE支持良好
对于初学者,推荐使用IntelliJ IDEA Community版,它提供了完善的Java开发支持且免费使用。
2.3 项目结构与构建工具
标准的Java项目结构遵循Maven约定:
project-root/ ├── src/ │ ├── main/ │ │ ├── java/ # Java源代码 │ │ └── resources/ # 资源文件 │ └── test/ │ ├── java/ # 测试代码 │ └── resources/ # 测试资源 ├── target/ # 构建输出 └── pom.xml # Maven配置文件现代Java项目通常使用构建工具管理依赖和构建过程:
- Maven:基于XML配置,生态成熟
- Gradle:基于Groovy/Kotlin DSL,构建速度快
- Ant:较老的构建工具,现在较少使用
3. Java核心API与常用类库
3.1 集合框架
Java集合框架位于java.util包中,主要接口和类包括:
List:有序集合,允许重复
- ArrayList:基于动态数组,随机访问快
- LinkedList:基于链表,插入删除快
- Vector:线程安全版ArrayList(已过时)
Set:不重复集合
- HashSet:基于哈希表,无序
- TreeSet:基于红黑树,有序
- LinkedHashSet:保持插入顺序
Map:键值对映射
- HashMap:基于哈希表,允许null键值
- TreeMap:基于红黑树,键有序
- LinkedHashMap:保持插入顺序
- Hashtable:线程安全版HashMap(已过时)
// 集合使用示例 List<String> list = new ArrayList<>(); list.add("Java"); list.add("Python"); list.forEach(System.out::println); Map<String, Integer> map = new HashMap<>(); map.put("Alice", 25); map.put("Bob", 30); map.forEach((k, v) -> System.out.println(k + ": " + v));3.2 IO与NIO
Java IO分为字节流(InputStream/OutputStream)和字符流(Reader/Writer)两大类。常用类包括:
- 文件操作:FileInputStream/FileOutputStream, FileReader/FileWriter
- 缓冲流:BufferedInputStream/BufferedOutputStream, BufferedReader/BufferedWriter
- 对象序列化:ObjectInputStream/ObjectOutputStream
Java NIO(New IO)提供了更高效的IO操作,核心组件包括:
- Channel:双向数据传输通道
- Buffer:数据容器
- Selector:多路复用器
// 使用Files类简化文件操作(Java 7+) Path path = Paths.get("test.txt"); List<String> lines = Files.readAllLines(path, StandardCharsets.UTF_8); Files.write(path, lines, StandardCharsets.UTF_8);3.3 多线程编程
Java通过Thread类和Runnable接口支持多线程编程。现代Java更推荐使用Executor框架管理线程。
线程创建:
- 继承Thread类
- 实现Runnable接口
- 实现Callable接口(可返回结果)
线程同步:
- synchronized关键字
- Lock接口及其实现类
- volatile关键字
- 原子类(AtomicInteger等)
线程池:
- Executors工厂类
- ThreadPoolExecutor
- ForkJoinPool(适合分治任务)
// 线程池使用示例 ExecutorService executor = Executors.newFixedThreadPool(4); Future<Integer> future = executor.submit(() -> { // 长时间计算 return 42; }); // 其他操作... int result = future.get(); // 获取计算结果 executor.shutdown();4. Java新特性与最佳实践
4.1 Java 8+重要新特性
Lambda表达式:简化匿名内部类写法
List<String> names = Arrays.asList("Alice", "Bob", "Charlie"); names.sort((a, b) -> a.compareTo(b));Stream API:函数式集合操作
List<String> filtered = names.stream() .filter(name -> name.startsWith("A")) .collect(Collectors.toList());Optional:优雅处理null值
Optional<String> opt = Optional.ofNullable(getName()); String name = opt.orElse("default");模块系统(Java 9):通过module-info.java定义模块
局部变量类型推断(Java 10):var关键字
文本块(Java 15):简化多行字符串书写
记录类(Java 16):简化POJO定义
模式匹配(Java 17+):简化instanceof检查
4.2 Java编码最佳实践
命名规范:
- 类名使用大驼峰:MyClass
- 方法/变量使用小驼峰:myMethod
- 常量全大写:MAX_VALUE
- 包名全小写:com.example.project
代码组织:
- 一个类一个文件
- 合理使用包组织代码
- 类成员顺序:字段→构造方法→普通方法
文档注释:
- 使用Javadoc注释公共API
- @param描述参数
- @return描述返回值
- @throws描述可能抛出的异常
单元测试:
- 使用JUnit框架
- 测试方法应独立、可重复
- 遵循Given-When-Then模式
// 单元测试示例 @Test void shouldReturnTrueWhenNumberIsEven() { // Given int number = 4; // When boolean result = isEven(number); // Then assertTrue(result); }4.3 常见问题排查
ClassNotFoundException/NoClassDefFoundError:
- 检查类路径配置
- 确认依赖是否完整
- 检查类名拼写是否正确
NullPointerException:
- 使用Optional避免null检查
- 添加必要的null检查
- 使用Objects.requireNonNull验证参数
OutOfMemoryError:
- 增加JVM堆内存(-Xmx参数)
- 检查内存泄漏(使用VisualVM等工具)
- 优化数据结构使用
编码问题:
- 统一使用UTF-8编码
- 在读写文件时明确指定编码
- 数据库连接设置正确编码
版本兼容性问题:
- 确保编译版本和运行版本一致
- 使用--release选项确保API兼容性
- 检查依赖库的版本要求
在实际开发中,合理使用日志工具(如SLF4J+Logback)可以帮助快速定位问题。对于复杂问题,可以使用调试器逐步执行或使用Java Flight Recorder进行性能分析。