第2章 Scala基础语法高频问题
本章聚焦面试中最高频的 Scala 基础语法考点:val/var 区别、伴生对象与 apply、模式匹配。这些问题看似简单,实则是检验你函数式思维、对象系统理解及编码习惯的敲门砖。掌握一套结构化回答框架,让你在基础题上稳拿满分。
📘 知识结构速览
| 知识点 | 核心定义 | 典型面试问法 | 回答关键词 |
|---|---|---|---|
| val / var | val 不可变引用,var 可变引用 | val 和 var 的区别?什么场景用哪个? | 不可变、线程安全、优先用 val |
| 伴生对象 | 与类同名且使用 object 声明的单例 | 伴生对象的作用?与类的静态成员有什么关系? | 静态方法、工厂方法、apply 入口 |
| apply 方法 | 语法糖,省去 new 关键字 | apply 是如何工作的?自己如何实现? | object.apply、伴生对象、工厂 |
| 模式匹配 | 类似 switch 但更强大,支持解构 | 模式匹配和 if-else 的区别?常用模式? | 可读性、case class、提取器 |
🎯 面试问答卡片
卡片 ①:val vs var
面试问题:Scala 中 val 和 var 有什么区别?实际开发中你更倾向用哪个?
🎯 考察点:基础语法理解、函数式编程意识、代码规范
📐 回答框架:① 定义区别:val 只赋值一次,var 可多次赋值;② 底层原理:val 对应 final 字段,var 对应普通字段;③ 使用倾向:优先用 val,保证不可变、易并发、易推理;④ 例外场景:累加器、状态缓存需用 var,但尽量局部化。
📌 简短示例回答:“val 是值不可变的引用,一旦初始化不可再指向新的对象;var 则是可变的引用。在函数式风格中我优先使用 val,因为不可变性可以避免副作用、简化并发。只有涉及累加器或需要改变引用时才用 var,且尽量用局部 var 而非成员变量。”
❓ 可能追问:1. val 指向的对象内容可变吗? 2. 如何用 val 实现状态变化?(用递归或数据副本)
卡片 ②:伴生对象与 apply
面试问题:Scala 中伴生对象和 apply 方法有什么作用?请举例说明。
🎯 考察点:对象系统理解、工厂模式、语言糖理解
📐 回答框架:① 伴生对象是与类同名的单例 object,可以访问类的私有成员,替代 Java 的 static;② apply 是伴生对象中一种特殊方法,调用时省略 new;③ 典型用途:工厂方法、集合构造(如 List(1,2,3));④ 自定义:在伴生对象中定义 apply(参数) 即可。
📌 简短示例回答:“伴生对象提供了类的静态区域,常用于定义工厂方法。比如在 case class 的伴生对象中自带 apply,让我们能直接用 Person("Alice") 创建实例,无需写 new。我自己也经常在伴生对象里定义 apply 做参数校验或构造简化。”
❓ 可能追问:1. 伴生对象与嵌套 object 的区别? 2. apply 可以有多个重载吗? 3. 为什么 case class 会自动生成 apply?
卡片 ③:模式匹配
面试问题:Scala 中的模式匹配有什么特点?与 Java 的 switch 相比有哪些优势?
🎯 考察点:语言特性掌握、解构能力、实际应用经验
📐 回答框架:① 基本用法:match-case 语法,比 switch 更灵活;② 优势——支持类型匹配、解构、守卫条件、表达式返回值;③ 典型场景:匹配 Option、case class 解构、集合模式;④ 注意事项:必须穷举或加通配符 _,否则编译警告。
📌 简短示例回答:“模式匹配是 Scala 的核心特性,它不仅能做值匹配,还能匹配类型(如 case s: String =>)、解构 case class(如 case Person(name, age) =>)、带守卫条件(case x if x > 0 =>)。相比 Java 的 switch,它是表达式而非语句,可以返回结果,且编译器会检查穷举性。”
❓ 可能追问:1. 模式匹配如何匹配 sealed 类? 2. 提取器(unapply)是如何工作的? 3. 模式匹配在 Spark 代码中如何应用?