第三份:Java 面向对象编程(OOP)进阶篇③:函数式编程 + 常用 API + 综合案例 + 15 道高频面试题
(初学者友好 + 可运行代码 + 面试题详解)
前言
初学 Java 函数式编程时,我看不懂 Lambda 表达式的简化规则、方法引用的适用场景,面试时面对综合案例题无从下手 —— 函数式编程是 JDK8+ 的核心特性,常用 API(String、ArrayList)是开发必备,综合案例则是检验 OOP 掌握程度的关键。这篇内容把函数式编程、常用 API、GUI 编程和 15 道难度递增的面试题拆解清楚,所有代码极简可运行,帮新手从理论落地到实践,应对面试和开发场景。
一、核心思路 / 概念(大白话讲透)
- 函数式编程:核心是「关注做什么,而非怎么做」—— 通过 Lambda 表达式和方法引用简化代码,基于函数式接口实现,告别冗余的匿名内部类。
- String 类:核心是「不可变字符串」—— 创建后内容不能改,常量池避免重复创建,是开发中最常用的类。
- ArrayList 类:核心是「动态数组」—— 支持自动扩容,是存储数据的首选集合。
- GUI 编程(Swing):核心是「图形化界面」—— 用组件和布局管理器搭建界面,事件监听处理用户操作(虽日常开发少用,但适合练手)。
二、实操步骤 + 可运行代码
2.1 函数式编程(JDK8+)
2.1.1 Lambda 表达式(简化匿名内部类)
java
运行
import java.util.Arrays; import java.util.Comparator; class Student { String name; int age; public Student(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return name + "," + age + "岁"; } } public class LambdaDemo { public static void main(String[] args) { Student[] students = {new Student("张三",20), new Student("李四",18)}; // 匿名内部类排序 Arrays.sort(students, new Comparator<Student>() { @Override public int compare(Student s1, Student s2) { return s1.age - s2.age; } }); // Lambda简化(完整→最简) Arrays.sort(students, (s1, s2) -> s1.age - s2.age); System.out.println(Arrays.toString(students)); // 输出:李四,18岁, 张三,20岁 } }2.1.2 方法引用(Lambda 进一步简化)
java
运行
import java.util.Arrays; import java.util.function.Supplier; public class MethodRefDemo { public static void main(String[] args) { // 1. 特定类型方法引用:字符串按长度排序 String[] strs = {"apple", "banana"}; Arrays.sort(strs, String::length); System.out.println(Arrays.toString(strs)); // 输出:[apple, banana] // 2. 构造器引用:创建对象 Supplier<StringBuilder> sup = StringBuilder::new; System.out.println(sup.get()); // 输出:空字符串 } }2.2 常用 API
2.2.1 String 类(核心方法)
java
运行
public class StringDemo { public static void main(String[] args) { String s = "Hello World"; System.out.println(s.length()); // 长度:11 System.out.println(s.substring(0,5)); // 截取:Hello System.out.println(s.replace("World", "Java")); // 替换:Hello Java System.out.println(s.contains("World")); // 包含:true // 常量池:直接赋值vs new String s1 = "abc"; String s2 = new String("abc").intern(); System.out.println(s1 == s2); // true:都指向常量池 } }2.2.2 ArrayList 类(核心方法)
java
运行
import java.util.ArrayList; import java.util.List; public class ArrayListDemo { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("a"); // 添加 list.add("b"); System.out.println(list.get(0)); // 获取:a list.set(1, "c"); // 修改:[a,c] list.remove(0); // 删除:[c] System.out.println(list.size()); // 大小:1 } }2.2.3 GUI 编程(Swing 简单示例)
java
运行
import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class SwingDemo { public static void main(String[] args) { // 1. 创建窗口 JFrame frame = new JFrame("Swing示例"); frame.setSize(400, 300); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLocationRelativeTo(null); // 2. 创建按钮 JButton btn = new JButton("点击我"); btn.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { JOptionPane.showMessageDialog(frame, "按钮被点击!"); } }); // 3. 组装组件 frame.add(btn); frame.setVisible(true); } }2.3 综合案例:员工信息管理系统(核心代码)
2.3.1 员工实体类
java
运行
public class Employee { private int id; private String name; private String job; private String dept; // 构造器+getter/setter+toString(省略,参考前文) }2.3.2 数据访问接口 + 实现
java
运行
import java.util.ArrayList; import java.util.List; public interface EmployeeDAO { void add(Employee emp); List<Employee> queryAll(); boolean delete(int id); } public class EmployeeDAOImpl implements EmployeeDAO { private List<Employee> list = new ArrayList<>(); private int nextId = 1; @Override public void add(Employee emp) { emp.setId(nextId++); list.add(emp); } @Override public List<Employee> queryAll() { return new ArrayList<>(list); } @Override public boolean delete(int id) { for (Employee emp : list) { if (emp.getId() == id) { list.remove(emp); return true; } } return false; } }2.3.3 GUI 界面(核心逻辑)
java
运行
import javax.swing.*; import javax.swing.table.DefaultTableModel; import java.awt.*; public class EmployeeFrame extends JFrame { private EmployeeDAO dao = new EmployeeDAOImpl(); private DefaultTableModel tableModel; public EmployeeFrame() { // 窗口初始化(省略,参考前文) // 表格展示、添加/删除按钮逻辑(省略,参考前文) } public static void main(String[] args) { new EmployeeFrame(); } }三、15 道 OOP 高级面试题(核心精选)
| 题号 | 核心考点 | 核心答案摘要 |
|---|---|---|
| 1 | 方法重写规则 | 方法名 / 参数列表一致、权限不缩小、返回值兼容、私有 / 静态方法不能重写 |
| 2 | 子类构造器规则 | 必须先调用父类构造器(super ()),this ()/super () 不能共存(都要第一行) |
| 3 | 多态的属性 vs 方法 | 方法动态绑定(看对象),属性无多态(看引用) |
| 4 | 向下转型 | 需用 instanceof 校验,避免 ClassCastException |
| 5 | final 关键字 | 修饰类不可继承、方法不可重写、变量不可改值,static final 是全局常量 |
| 6 | 抽象类 | 不能创建对象,子类必须实现所有抽象方法,否则子类也需抽象 |
| 7 | 接口 JDK8+ 新特性 | 默认方法(可重写)、静态方法(接口名调用)、私有方法(接口内部用) |
| 8 | 抽象类 vs 接口 | 抽象类单继承、含普通方法;接口多实现、默认 public 成员 |
| 9 | 单例模式 | 饿汉式线程安全但懒加载;懒汉式需双重检查锁 + volatile;枚举单例最安全 |
| 10 | 枚举类 | 不可继承、构造器私有、values () 返回所有常量,类型安全 |
| 11 | 代码块执行顺序 | 父静态→子静态→父实例→父构造→子实例→子构造 |
| 12 | 内部类 | 成员内部类依赖外部实例,静态内部类不依赖,匿名内部类简化一次性实现 |
| 13 | Lambda 表达式 | 函数式接口为前提,简化匿名内部类,支持参数类型省略、大括号省略 |
| 14 | 方法引用 | Lambda 简化版,分静态 / 实例 / 特定类型 / 构造器引用,仅调用已有方法时使用 |
| 15 | OOP 综合设计 | 体现封装 / 多态 / 接口,新增功能无需修改原有代码(开闭原则) |
四、总结
- 函数式编程核心:Lambda 基于函数式接口,方法引用是 Lambda 的简化,让代码更简洁;
- 常用 API 核心:String 不可变、常量池优化,ArrayList 动态扩容,开发中优先使用;
- 综合案例核心:接口定义规范、ArrayList 存储数据、Swing 搭建界面,体现 OOP 封装 / 多态 / 开闭原则;
- 面试核心:重点掌握方法重写、多态、抽象类 vs 接口、单例模式、Lambda 表达式,理解底层逻辑而非死记。