自从 2015 年做了技术经理之后,一直到最近几年做面试辅导时,经常会遇到这样尴尬的场景:
面试官:HashMap 的扩容因子为什么是 0.75? 候选人:……因为源码里写的就是 0.75? 面试官:那如果改成 0.5 会怎样? 候选人:……会炸?
上面的场景,如果你是面试官或有看模拟面试,那么你一定会经常见到,只是题目可能稍有不同,但结果都是一样的“出门右转”。
所以,真正决定面试结果的,不是题库覆盖率,而是“让面试官相信你有解决问题、并将技能变现”的能力,而这些都不是通过简单的刷(面试)题能解决的。
举个实际的案例,例如如果我问你:
抽象类和接口有什么区别?
那么刷过面试题的同学可能都能回答上来,但如果我这样问:
说说抽象类和接口的典型使用场景?
这个时候很多同学就回答不上来了。
所以,搞定面试从来都不是只刷面试题就够了,要搞定面试需要做到以下几点:
只有这样才能正在的搞定面试官,拿下心仪的 Offer。
接下来,咱们来看下:说说抽象类和接口的典型使用场景?这个问题应该怎么回答,大家也可以借鉴这种方式来刷题和回答面试官。
要回答这个问题,咱们可以使用以下方式来回答:
先讲清定义(最后用自己的话来讲):
一句话总结:抽象类是 is-a 的模板复用,接口是 has-a 的规范定义。实际项目中,抽象类和接口通常会配合使用。
抽象类电商项目的使用场景案例:
abstract class OrderProcessor {
// 公共状态:订单ID、用户ID
protected String orderId;
protected Long userId;
// 模板方法:定义处理流程
public final void process() {
validateStock(); // 验证库存
calculatePrice(); // 扣费
processPayment(); // 执行付款
updateInventory(); // 更新库存
}
// 子类必须实现差异化的部分
protected abstract void calculatePrice(); // 普通订单 vs 秒杀订单计价不同
}
// 子类实现:秒杀订单
class FlashSaleOrder extends OrderProcessor {
@Override
protected void calculatePrice() {
// 秒杀价逻辑
}
}
还有像 AI 项目实现知识库时,执行以下流程:
其中,数据入库的流程为统一步骤,所以定义抽象类实现统一方法,但其中解析方法需要定义为抽象方法,各个加载器(子类)各种实现。
接口的使用场景就有很多了,比较经典的像支付功能实现:
interface PaymentMethod {
void pay(BigDecimal amount); // 定义支付能力
}
// 支付宝实现
class Alipay implements PaymentMethod {
public void pay(BigDecimal amount) {
// 调用支付宝SDK
}
}
// 微信支付实现
class WechatPay implements PaymentMethod {
public void pay(BigDecimal amount) {
// 调用微信SDK
}
}
经典的策略模式的实现,不同渠道实现不同支付方法,并且方法之间可以相互替换。
还有像我们使用三层结构时,服务层会实现接口定义公共方法,然后再在子类中提供实现,如下代码所示:
简单的刷题只能让你获得基础问题的“标准”答案,而面试要的是你内化的技能能力,而不是“标准”答案,否则面试官可以直接去问 AI 了,所以要搞定面试需要做到以下几点:
只有这样才能正在的搞定面试官,拿下心仪的 Offer。
本文已收录到我的面试小站 www.javacn.site,其中包含的内容有:场景题、SpringAI、SpringAIAlibaba、并发编程、MySQL、Redis、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、JVM、设计模式、消息队列、Dify、Coze、AI常见面试题等。