2026/3/29 8:03:32
网站建设
项目流程
扁平风网站,东莞网络推广案例,广州建站模板搭建,木材模板.网站前言
Java 进阶阶段的核心知识点围绕「工具使用、代码组织、数据存储、动态编程」展开#xff0c;本文涵盖 Junit 单元测试、内部类、集合框架、可变参数、反射 5 大核心模块#xff0c;每个知识点都附带可直接复制的实战代码和新手避坑提示#xff0c;适合刚入门 Java 的同…前言Java 进阶阶段的核心知识点围绕「工具使用、代码组织、数据存储、动态编程」展开本文涵盖 Junit 单元测试、内部类、集合框架、可变参数、反射 5 大核心模块每个知识点都附带可直接复制的实战代码和新手避坑提示适合刚入门 Java 的同学系统学习也可作为开发必备手册查阅一、Junit 单元测试告别 main 方法的高效测试工具1. 核心作用Junit 是 Java 的单元测试框架白盒测试无需依赖main方法就能独立执行代码片段快速验证功能正确性是开发中调试代码的必备工具。2. 环境准备需导入两个第三方 jar 包文末附下载链接junit-4.12.jar核心包https://repo1.maven.org/maven2/junit/junit/4.12/junit-4.12.jarhamcrest-core-1.3.jar依赖包https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar导入方式IDEA 中右键项目→Open Module Settings→Libraries→→选择 jar 包路径3. 基础使用步骤附代码import org.junit.After; import org.junit.Before; import org.junit.Test; // 测试类类名建议以Test结尾 public class CalculatorTest { // 初始化资源测试方法执行前自动执行 Before public void init() { System.out.println(测试开始初始化数据...); } // 测试方法Test注解标记 Test public void testAdd() { int a 10; int b 20; int result a b; System.out.println(1020 result); } // 释放资源测试方法执行后自动执行 After public void destroy() { System.out.println(测试结束释放资源...); } }4. 关键规则与避坑测试方法必须满足public void 方法名()无参数建议以test开头执行方式点击方法左侧绿色箭头绿色 成功红色 失败避坑忘记导入 jar 包会报ClassNotFoundException需检查 Libraries 配置二、内部类代码组织的灵活技巧1. 内部类分类与核心价值内部类是类中嵌套的类核心价值是「隐藏实现细节、优化代码结构」主要分为 3 类成员内部类直接定义在外部类成员位置少用局部内部类定义在外部类方法内部少用匿名内部类无名称的局部内部类开发常用重点掌握2. 匿名内部类实战核心1使用前提存在一个类普通类 / 抽象类或接口且仅需使用一次该类的对象。2实战案例接口的匿名实现// 定义一个接口 interface Animal { void eat(); } public class AnonymousDemo { public static void main(String[] args) { // 匿名内部类实现Animal接口的匿名子类对象 Animal cat new Animal() { Override public void eat() { System.out.println(猫吃鱼); } }; // 调用方法 cat.eat(); // 输出猫吃鱼 } }3核心注意事项本质匿名内部类是「继承类 / 实现接口的匿名子类对象」场景当接口 / 抽象类的抽象方法≤3 个时优先使用避坑匿名内部类中不能定义静态成员三、集合框架Java 数据存储的核心工具重点中的重点集合是存储多个同类型数据的动态容器长度可变顶层分为「单列集合Collection」和「双列集合Map」核心原则学顶层共性方法用底层具体实现。1. 集合体系图新手必背Collection单列集合顶层接口 ├─ List有序、可重复、有索引 │ ├─ ArrayList底层数组查询/修改快增删慢 │ └─ LinkedList底层链表增删快查询/修改慢 └─ Set无序、唯一、无索引 ├─ HashSet底层哈希表无序唯一 └─ TreeSet底层红黑树有序唯一 Map双列集合顶层接口键值对存储键唯一 ├─ HashMap底层哈希表无序 └─ TreeMap底层红黑树有序2. 单列集合Collection实战1List 集合ArrayList 为例import java.util.ArrayList; import java.util.List; public class ListDemo { public static void main(String[] args) { // 1. 创建集合对象泛型限定存储String类型 ListString list new ArrayList(); // 2. 添加元素 list.add(Java); list.add(Python); list.add(C); // 3. 特有方法带索引 list.add(1, Go); // 索引1插入元素 list.set(2, JavaScript); // 修改索引2元素 String elem list.get(0); // 获取索引0元素 list.remove(3); // 删除索引3元素 // 4. 遍历方式3种 // 方式1普通for循环带索引 for (int i 0; i list.size(); i) { System.out.println(list.get(i)); } // 方式2增强for循环简洁 for (String s : list) { System.out.println(s); } // 方式3列表迭代器支持逆向遍历 java.util.ListIteratorString it list.listIterator(); while (it.hasNext()) { System.out.println(it.next()); } } }2Set 集合HashSet 为例import java.util.HashSet; import java.util.Set; public class SetDemo { public static void main(String[] args) { SetString set new HashSet(); // 添加元素自动去重 set.add(张三); set.add(李四); set.add(张三); // 重复元素不存储 // 遍历无索引只能用增强for/迭代器 for (String name : set) { System.out.println(name); // 输出张三、李四顺序不固定 } } }3避坑提示List 的「并发修改异常」迭代器遍历期间用集合add/remove会报错解决方案用ListIterator的add方法或普通 for 循环HashSet 的唯一性存储自定义对象时需重写hashCode()和equals()方法否则无法去重3. 双列集合Map实战HashMap 为例import java.util.HashMap; import java.util.Map; import java.util.Set; public class MapDemo { public static void main(String[] args) { // 1. 创建Map对象键学号值姓名 MapString, String map new HashMap(); // 2. 添加键值对键重复则覆盖值 map.put(itheima001, 张三); map.put(itheima002, 李四); map.put(itheima003, 王五); // 3. 核心方法 String name map.get(itheima002); // 根据键取值 map.remove(itheima003); // 根据键删除 boolean hasKey map.containsKey(itheima001); // 判断键是否存在 // 4. 遍历方式核心根据键找值 SetString keys map.keySet(); // 获取所有键的集合 for (String key : keys) { String value map.get(key); System.out.println(key → value); } } }4. 集合工具类Collectionsimport java.util.ArrayList; import java.util.Collections; import java.util.List; public class CollectionsDemo { public static void main(String[] args) { ListInteger list new ArrayList(); list.add(3); list.add(1); list.add(2); Collections.sort(list); // 升序排序[1,2,3] Collections.reverse(list); // 反转[3,2,1] Collections.shuffle(list); // 随机打乱顺序随机 System.out.println(list); } }四、可变参数简化方法重载的实用技巧1. 核心作用解决「参数个数不固定」的问题替代多次重载方法如求和、拼接字符串。2. 语法与实战案例public class VarArgsDemo { public static void main(String[] args) { System.out.println(getSum(10, 20)); // 输出30 System.out.println(getSum(10, 20, 30)); // 输出60 System.out.println(getSum(10, 20, 30, 40)); // 输出100 } // 可变参数语法数据类型... 变量名本质是数组 public static int getSum(int... nums) { int sum 0; for (int num : nums) { sum num; } return sum; } }3. 避坑规则方法形参列表中只能有一个可变参数可变参数必须放在形参列表的最后一位可变参数本质是数组可直接按数组方式遍历五、反射Java 动态编程的核心进阶重点1. 核心作用在程序运行时动态获取类的成员构造方法、变量、方法并创建对象、调用方法增强程序灵活性如框架底层、配置文件驱动开发。2. 获取 Class 对象的 3 种方式public class ReflectDemo { public static void main(String[] args) throws ClassNotFoundException { // 方式1类名.class编译期确定最直接 Class? c1 Student.class; // 方式2对象.getClass()运行期确定需创建对象 Student student new Student(); Class? c2 student.getClass(); // 方式3Class.forName(全类名)运行期确定最灵活常用 Class? c3 Class.forName(com.itheima.Student); // 验证同一个类的Class对象唯一 System.out.println(c1 c2); // true System.out.println(c1 c3); // true } } // 自定义学生类用于反射测试 class Student { private String name; public int age; // 无参构造 public Student() {} // 有参构造 public Student(String name, int age) { this.name name; this.age age; } // 成员方法 public void study() { System.out.println(name 正在学习); } // getter/setter省略 }3. 反射操作核心成员实战1操作构造方法创建对象import java.lang.reflect.Constructor; public class ReflectConstructor { public static void main(String[] args) throws Exception { Class? c Class.forName(com.itheima.Student); // 1. 获取无参构造创建对象 Constructor? con1 c.getConstructor(); Object student1 con1.newInstance(); System.out.println(student1); // 2. 获取有参构造创建对象 Constructor? con2 c.getConstructor(String.class, int.class); Object student2 con2.newInstance(张三, 20); System.out.println(student2); } }2操作成员变量赋值 / 取值import java.lang.reflect.Field; public class ReflectField { public static void main(String[] args) throws Exception { Class? c Class.forName(com.itheima.Student); Object student c.getConstructor().newInstance(); // 1. 操作公共变量age Field ageField c.getField(age); ageField.set(student, 22); // 赋值 System.out.println(ageField.get(student)); // 取值22 // 2. 操作私有变量name- 需暴力反射 Field nameField c.getDeclaredField(name); nameField.setAccessible(true); // 忽略访问权限检查 nameField.set(student, 李四); // 赋值 System.out.println(nameField.get(student)); // 取值李四 } }3操作成员方法调用方法import java.lang.reflect.Method; public class ReflectMethod { public static void main(String[] args) throws Exception { Class? c Class.forName(com.itheima.Student); Object student c.getConstructor(String.class, int.class).newInstance(王五, 21); // 获取study方法并调用 Method studyMethod c.getMethod(study); studyMethod.invoke(student); // 输出王五正在学习 } }4. 避坑提示访问私有成员需调用setAccessible(true)暴力反射异常处理反射相关方法会抛出多个受检异常需捕获或抛出性能问题反射效率低于直接调用非必要场景不滥用六、总结与学习建议1. 核心重点排序集合框架开发中最常用必须熟练掌握 List、Map反射进阶必备框架底层核心匿名内部类日常开发高频使用Junit 单元测试调试代码效率神器可变参数简化代码的小技巧2. 实战建议集合多练习「存储自定义对象 遍历 去重 / 排序」场景反射结合配置文件实现「动态调用类方法」如读取配置文件中的类名和方法名通过反射执行工具类收藏本文开发中遇到相关场景直接复制代码修改3. 资源推荐Junitjar 包Oracle 官网下载或私信获取百度网盘链接集合练习模拟斗地主发牌、统计字符串中字符出现次数反射练习通过配置文件动态执行不同类的方法如果本文对你有帮助欢迎点赞 收藏 关注后续会更新 JavaIO 流、多线程、框架等进阶内容一起从 Java 新手成长为开发大佬 如有疑问评论区留言第一时间回复