今天的练习
今天练了三道八股:Java 的面向对象三大特性、前端的 Vue 生命周期、Redis 的持久化与内存管理。前两道答得不错,Redis 只答完了持久化部分。最该记住的坑,是 Java 那道 @Override——我把它的作用完全说反了。
题目一:面向对象三大特性 + 重载 vs 重写
封装、继承、多态分别是什么?重载和重写有什么区别?哪些方法不能被重写?@Override 注解的作用是什么?
我的回答里,封装和多态都答到了点上,继承也基本对。但 @Override 那句翻了车:我信誓旦旦地说「没写 @Override 会编译报错」——恰恰相反,它是个可选注解,不写照样能重写。
复盘
- @Override 说反了:不是「没写会报错」,而是「写了、但方法签名没真正重写父类方法时,才报错」。它的作用是让编译器帮你检查,属于「防呆」。
- 继承漏了两点:private 成员和构造方法不被继承;Java 是单继承。
标准答案
- 重载:同一个类内、方法名相同、参数列表不同,编译期多态。
- 重写:父子类之间、方法签名相同,运行期多态(动态绑定)。
- 不能重写:final、static(是隐藏不是重写)、private、构造方法。
一句话记住
重载看参数,重写看签名;@Override 是「防呆」,不是「必须」。
题目二:Vue3 生命周期与 keep-alive
Vue3 的生命周期钩子有哪些?父子组件钩子执行顺序?keep-alive 缓存的组件触发哪些钩子?
这道题答得接近满分,生命周期表、keep-alive 的激活/停用顺序都列对了,还打了个「setup 是设计图纸、onMounted 是房子建好」的比方。
复盘
- 「before 父在前」要修正:created 也是父先执行。更准的口诀是「开始类钩子父先、完成类钩子子先」。
- beforeCreate 和 created 是一起被 setup 取代的:setup 执行时机夹在两者之间。
标准答案
- 开始类(父先):beforeCreate → created → beforeMount → beforeUpdate → beforeUnmount。
- 完成类(子先):mounted → updated → unmounted。
- keep-alive:首次进入触发 onBeforeMount → onMounted → onActivated;切走只触发 onDeactivated(不触发 onUnmounted);再次进入只触发 onActivated。
一句话记住
父组件要等子组件都就位,才算真正挂载完成——所以 mounted 子先父后。
题目三:Redis 持久化与内存管理(答了一半)
Redis 的 RDB 和 AOF 持久化有什么区别?内存淘汰策略有哪些?分布式锁为什么不能只靠 SETNX?
持久化部分答得接近满分,RDB 快照、AOF 日志、触发方式、丢数据粒度都说对了。内存淘汰只开了个头,分布式锁没来得及答。
复盘
- 两个笔误:AOF 写成了 AOP、everysec 写成了 evertsec,面试口述要注意。
- 没答完:淘汰策略细节、LRU/LFU 区别、分布式锁的三个坑,留到下次补。
标准答案
- RDB:快照、二进制、适合全量备份,丢最后一次 save 之后的数据。
- AOF:命令日志、可读、everysec 丢最后一秒,always 几乎不丢。
- 混合持久化:aof-use-rdb-preamble yes,RDB 全量 + AOF 增量,线上最常用。
一句话记住
RDB 快照全量、AOF 日志增量,混合持久化两头兼顾。
八股这东西,最怕的不是不会,而是「以为自己会」——尤其是那些看着最熟的基础题,最容易一开口就说反。
今天三道题,两道接近满分、一道答了一半。@Override 那个反例记牢了,Redis 剩下的下次补上。