目录
一、final 变量:贴在价签上的价格 —— 改不了!
二、final 方法:祖传的收银流程 —— 动不得!
三、final 类:独门配方的辣椒酱 —— 抄不走!
四、final 的 "死规矩" 也有灵活处
小区超市的王老板最近在店里贴了一堆告示:"特价鸡蛋每人限购 3 斤,概不还价"、"收银台备用金仅限找零,不准挪用"。员工小李嘟囔:"这规矩也太死了",王老板眼一瞪:"这叫 'final',懂不懂?"
一、final 变量:贴在价签上的价格 —— 改不了!
王老板的价签是出了名的 "一言九鼎"。上次有顾客想让他把 "5.99 元 / 斤" 的苹果改成 "5.5 元",王老板指着价签说:"这价签是 final 的,改不了!"
// 就像王老板的价签
final double APPLE_PRICE = 5.99;
// 顾客想砍价
// APPLE_PRICE = 5.5; // 编译报错:这价改不了!
但王老板也不是完全死板。新进的香蕉还没定价,他会先写个 "待定价",等核算完成本再填:
// 先声明,后定价(构造器里赋值)
final double BANANA_PRICE;
// 进货后算好价格
public Supermarket() {
BANANA_PRICE = 3.99; // 这次定了就不能改了
}
段子解读:final 变量就像超市里贴死的价签,一旦写上数字(初始化),谁来都改不了。但可以先贴个空签(声明时不赋值),等算好账再填(构造器或静态代码块赋值),填完照样不能改。
二、final 方法:祖传的收银流程 —— 动不得!
王老板他爹传下来一套收银流程:"先扫码、再装袋、最后报金额",谁都不能改。小李想试试 "先装袋再扫码",被王老板一顿骂:"这是 final 方法,动不得!"
class OldBoss {
// 祖传收银流程(final方法)
final void checkout() {
System.out.println("1. 扫码 2. 装袋 3. 报金额");
}
}
class YoungBoss extends OldBoss {
// 想改祖传规矩?
// @Override
// void checkout() { // 编译报错:这流程改不了!
// System.out.println("1. 装袋 2. 扫码…");
// }
}
段子解读:final 方法就像老祖宗定下的规矩,子类(后代)只能照着做,不能瞎改。王老板说这是为了 "保证质量"—— 万一改乱了流程,多收钱少收钱都麻烦。
三、final 类:独门配方的辣椒酱 —— 抄不走!
王老板的秘制辣椒酱火了,有人想拜师学艺开分店,王老板摆摆手:"这配方是 final 类,不外传!"
// 秘制辣椒酱配方(final类)
final class SecretChiliSauce {
void make() {
System.out.println("独家配方:辣椒+八角+神秘调料");
}
}
// 想山寨?没门!
// class CopycatSauce extends SecretChiliSauce { // 编译报错:抄不了!
// }
段子解读:final 类就像独门秘方,不准别人继承(山寨)。Java 里的 String 类就是 final 的,保证了字符串一旦创建就不能被修改,不然你发的消息被人中途改了可就麻烦了。
四、final 的 "死规矩" 也有灵活处
别看王老板规矩多,他也懂变通:
final 数组:仓库里的 "应急物资箱" 是 final 的(不能换箱子),但里面的东西能换(数组内容可改)
final String[] EMERGENCY_BOX = {"创可贴", "碘伏"};
EMERGENCY_BOX[0] = "绷带"; // 可以换里面的东西
// EMERGENCY_BOX = new String[]{"…"}; // 不能换箱子本身
final 参数:顾客说 "买 3 斤苹果",称重时不能偷偷改成 5 斤(方法参数加 final,防止被篡改)
void sellApple(final int weight) {
// weight = 5; // 编译报错:不能多卖!
System.out.println("卖出" + weight + "斤苹果");
}
王老板的总结:"final 这东西,就像超市的规矩 —— 该死板的地方必须死板(比如价格、配方),该灵活的地方也得灵活(比如应急箱里的东西)。守住底线,生意才能长久!"
其实 Java 里的 final 也是这个道理:用它来保护那些不能改的核心内容(常量、关键方法、安全类),让代码像超市一样井井有条,少出乱子。
评论前必须登录!
注册