1. 面向对象编程初探从洗衣机的故事说起第一次接触面向对象编程时我盯着那个类字看了足足十分钟。直到有天修洗衣机师傅说这个型号的电路板都这样突然就明白了——类不就是洗衣机型号图纸而对象就是我家那台会唱歌的滚筒洗衣机吗面向对象编程(OOP)就像用乐高积木搭建程序。每个积木块(类)有固定的凹凸结构(接口)内部却可以填充不同颜色的颗粒(属性)。当我们需要一个红色窗户时不必重新发明塑料直接拿现成的窗户积木块指定颜色即可。这种思维方式彻底改变了我的编码习惯。2. 类与对象的本质解析2.1 类的设计哲学类(class)本质上是一份制造说明书。以咖啡机为例class CoffeeMachine { // 成员变量(属性) private int waterLevel; private String model; // 成员方法(行为) public void brewCoffee() { if(waterLevel 0) { System.out.println(Brewing...); } } }这段代码定义了咖啡机的灵魂——它能做什么(brewCoffee)和它有什么(waterLevel, model)。但注意这仅仅是图纸真正的咖啡机还没生产出来。2.2 对象实例化的魔法当执行CoffeeMachine myMachine new CoffeeMachine();时发生了三件关键事内存中开辟空间(买来原材料)调用构造方法(组装零件)返回对象引用(贴上使用标签)每个对象都是独立的个体。办公室那台总是卡纸的打印机和你家里那台常年吃灰的打印机虽然型号相同但状态完全不同——这就是实例化的重要意义。3. 成员变量与局部变量的生存战争3.1 成员变量的特点生命周期与对象共存亡就像咖啡机的水箱容量只要机器还在就存在作用域整个类内部可见所有方法都能访问存储位置堆内存(Heap)因为要长期保存状态3.2 局部变量的特性方法内部的变量就像临时工public void makeCoffee() { int temp 90; // 局部变量 System.out.println(Heating to temp °C); } // 这里访问temp会报错 - 临时工已离职关键区别存在时间仅限方法执行期间栈内存(Stack)分配用完即焚必须显式初始化不像成员变量有默认值4. 成员方法的实战技巧4.1 方法设计的黄金法则好的方法应该像瑞士军刀单一职责开瓶器就专心开瓶别兼职削苹果适度粒度不宜过长(超过20行就该警惕)明确输入输出参数不超过3个为佳反例// 糟糕的设计功能混杂参数过多 public void processOrder(int userId, String item, int qty, boolean useCoupon, String address) { // 验证用户、计算价格、扣库存、发邮件... }4.2 方法重载的妙用同名方法不同参数就像咖啡机的按钮public void brewCoffee() { brewCoffee(1); // 默认一杯 } public void brewCoffee(int cups) { // 实际冲泡逻辑 }编译器通过方法签名(方法名参数列表)来区分返回值类型不算签名部分。这个特性在构造方法中尤为常用。5. 面向对象三大特征初窥虽然完整特性后续会深入但先建立直观认知很重要5.1 封装(Encapsulation)把咖啡机电路板用外壳包起来只留下按钮和显示屏。对应到代码private String secretRecipe; // 私有配方 public String getRecipe() { // 公开获取方式 return secretRecipe.substring(0,3) ***; }5.2 继承(Inheritance)全自动咖啡机继承基础咖啡机的特性class SuperCoffeeMachine extends CoffeeMachine { public void autoClean() { /* 新增功能 */ } }5.3 多态(Polymorphism)同样的冲泡按钮美式咖啡机和意式咖啡机表现不同。后续会深入讨论动态绑定机制。6. 常见误区与调试技巧6.1 NullPointerException预防新手最常遇到的空指针问题CoffeeMachine machine null; machine.brewCoffee(); // 崩溃防御性编程建议对象判空if(machine ! null)Optional类(Java8)使用断言或Objects.requireNonNull6.2 内存泄漏陷阱集合类中的对象引用要及时清理ListCoffeeMachine machines new ArrayList(); machines.add(new CoffeeMachine()); // 忘记remove会导致对象无法被GC回收7. 从理论到实践咖啡店管理系统设计让我们用类图设计一个简易系统---------------- ----------------- | CoffeeShop | | Order | ---------------- ----------------- | -name: String |1 *|-orderId: int | | -address: String|----|-items: ListString| ---------------- ----------------- ^ | ---------------- | Barista | ---------------- | -skillLevel: int| | makeCoffee() | ----------------实现要点咖啡店聚合(has-a)订单咖啡师继承(
阅读完成 · 觉得有帮助?