你真的“懂”面向对象吗?那这三大特性,为什么写着写着就开始怀疑人生了?

📅 2026/7/27 9:55:17
你真的“懂”面向对象吗?那这三大特性,为什么写着写着就开始怀疑人生了?
你好欢迎来到我的博客我是【菜鸟不学编程】我是一个正在奋斗中的职场码农步入职场多年正在从“小码农”慢慢成长为有深度、有思考的技术人。在这条不断进阶的路上我决定记录下自己的学习与成长过程也希望通过博客结识更多志同道合的朋友。️ 主要方向包括 Java 基础、Spring 全家桶、数据库优化、项目实战等也会分享一些踩坑经历与面试复盘希望能为还在迷茫中的你提供一些参考。 我相信写作是一种思考的过程分享是一种进步的方式。如果你和我一样热爱技术、热爱成长欢迎关注我一起交流进步全文目录前言一、封装不是“把属性藏起来”而是**把风险关进笼子里**1️⃣ 为什么要封装2️⃣ 访问修饰符真正的封装核心3️⃣ 正确的封装示例强烈建议你这么写二、继承extends 不是“复制代码”而是**抽象共性**1️⃣ 继承的正确打开方式2️⃣ 一个靠谱的继承示例3️⃣ 方法重写Override不是随便写的三、多态真正让代码“活起来”的灵魂1️⃣ 如果没有多态世界会怎样2️⃣ 向上转型多态的入场券3️⃣ 动态绑定多态的真正魔法4️⃣ 一个真实开发级的多态示例四、三大特性放在一起你才算真的“入门”结语 写在最后前言说实话我第一次学面向对象的时候内心是崩溃的。什么封装、继承、多态老师讲得激情澎湃我听得一脸懵逼。直到后来写项目、改 Bug、被线上事故毒打过几次之后才猛然醒悟原来这三大特性不是为了考试而是为了“救命”的。今天这篇文章我不打算用“教科书口吻”跟你聊面向对象。我想用一个真实开发者视角把这三个特性拆开揉碎讲清楚它们解决了什么问题为什么你现在用着用着会迷糊到底怎么写才算“像个人写的代码”来泡杯咖啡☕我们慢慢聊。一、封装不是“把属性藏起来”而是把风险关进笼子里1️⃣ 为什么要封装先说一句扎心的80% 的 Bug都是因为“不该被改的东西被改了”。你有没有写过这种代码UserusernewUser();user.age-18;user.balance999999999;当时你可能想的是“我只是测试一下而已嘛”但项目一大人员一多这种“随便改”就会变成灾难。封装本质上就是我允许你用但不允许你乱来。2️⃣ 访问修饰符真正的封装核心修饰符含义常见使用场景private只能在当前类访问成员变量default同包可见内部模块protected同包 子类继承相关public全世界都能用对外 API3️⃣ 正确的封装示例强烈建议你这么写publicclassUser{privateintage;publicvoidsetAge(intage){if(age0||age150){thrownewIllegalArgumentException(年龄不合法);}this.ageage;}publicintgetAge(){returnage;}}你发现没有外部不能直接改 age所有修改都必须经过setAge规则集中、风险可控这才叫封装而不是“为了 private 而 private”。二、继承extends 不是“复制代码”而是抽象共性1️⃣ 继承的正确打开方式我见过太多人把继承当成“偷懒工具”“反正能用 extends直接继承不就完了”结果项目后期父类一改全家崩子类逻辑混乱牵一发而动全身继承的前提只有一个is-a是一个关系2️⃣ 一个靠谱的继承示例publicclassAnimal{publicvoidspeak(){System.out.println(动物在叫);}}publicclassDogextendsAnimal{Overridepublicvoidspeak(){System.out.println(狗在汪汪叫);}}这里有两个重点很多人会忽略3️⃣ 方法重写Override不是随便写的规则你一定要刻进 DNA方法名相同参数列表相同返回值相同或是子类型访问权限不能更严格Overridepublicvoidspeak(){System.out.println(狗在汪汪叫);}Override这个注解不是装饰品是救命符。它能在编译期帮你发现“你以为你重写了其实你没有”的低级错误。三、多态真正让代码“活起来”的灵魂1️⃣ 如果没有多态世界会怎样假设你写了一堆判断if(animalinstanceofDog){((Dog)animal).speak();}elseif(animalinstanceofCat){((Cat)animal).speak();}是不是已经开始头皮发麻了这不是代码这是灾难现场。2️⃣ 向上转型多态的入场券AnimalanimalnewDog();// 向上转型注意这句话编译期看左边Animal运行期看右边Dog3️⃣ 动态绑定多态的真正魔法AnimalanimalnewDog();animal.speak();输出结果是狗在汪汪叫哪怕变量类型是AnimalJVM 也会在运行时动态绑定到真实对象的方法。 这就是多态的精髓。4️⃣ 一个真实开发级的多态示例publicclassPayService{publicvoidpay(PayChannelchannel){channel.pay();}}publicinterfacePayChannel{voidpay();}publicclassAlipayimplementsPayChannel{publicvoidpay(){System.out.println(使用支付宝支付);}}publicclassWechatPayimplementsPayChannel{publicvoidpay(){System.out.println(使用微信支付);}}新增支付方式时你需要改原来的逻辑吗完全不用。这才是多态存在的真正意义对扩展开放对修改关闭。四、三大特性放在一起你才算真的“入门”特性解决的问题封装防止误用、降低风险继承复用共性、抽象结构多态解耦逻辑、增强扩展性它们不是三道独立的考题而是一整套对抗复杂度的武器系统。结语说句掏心窝子的你不需要背概念但你一定要写烂代码。只有当你被自己写的屎山代码反噬过你才会真正理解——为什么要封装、为什么继承不能乱用、为什么多态能救命。所以我想反问你一句你现在写的代码是在“用面向对象”还是在“假装面向对象” 写在最后如果你觉得这篇文章对你有帮助或者有任何想法、建议欢迎在评论区留言交流你的每一个点赞 、收藏 ⭐、关注 ❤️都是我持续更新的最大动力我是一个在代码世界里不断摸索的小码农愿我们都能在成长的路上越走越远越学越强感谢你的阅读我们下篇文章再见✍️ 作者某个被流“治愈”过的 Java 老兵 日期2025-08-25 本文原创转载请注明出处。