1. Java学习笔记_Day9深入理解面向对象编程核心机制今天是我系统学习Java的第9天终于开始接触面向对象编程(OOP)的核心概念。作为Java语言的基石OOP的三大特性——封装、继承和多态在实际开发中无处不在。下面我将详细记录今天的学习收获包括代码示例、常见误区和实用技巧。1.1 封装安全性与易用性的平衡艺术封装(Encapsulation)是OOP的第一道门槛它通过访问修饰符控制类成员的可见性。Java提供了四种访问级别public class BankAccount { private String accountNumber; // 完全私有 protected double balance; // 子类和同包可见 String ownerName; // 默认(package-private) public final String BANK_CODE CCB; // 公开常量 }关键经验字段(field)原则上都应该设为private通过getter/setter方法控制访问。IDEA快捷键AltInsert可快速生成这些方法。我在实践中发现几个易错点忘记对集合类型做防御性拷贝如返回new ArrayList(existingList)布尔类型getter应命名为isXXX()而非getXXX()对象字段的setter需要做null检查1.2 继承体系构建实战继承(Inheritance)的语法看似简单但实际使用时有很多注意事项。下面是一个图形类的继承案例class Shape { private String color; public double area() { throw new UnsupportedOperationException(); } } class Circle extends Shape { private double radius; Override public double area() { return Math.PI * radius * radius; } }继承使用要点慎用继承优先考虑组合(composition)父类方法用final禁止重写子类构造器必须调用父类构造器super()避免超过3层的继承深度踩坑记录我曾误以为子类会自动继承父类的构造方法实际上构造方法不属于继承范畴。1.3 多态的动态绑定机制多态(Polymorphism)是OOP最强大的特性之一其核心在于运行时类型识别(RTTI)。看这个典型例子ListString list new ArrayList(); // 向上转型 list.add(Java); int size list.size(); // 实际调用ArrayList的实现多态的实现依赖方法重写(Override) - 签名必须完全相同抽象类与抽象方法接口(interface)的默认方法类型转换注意事项使用instanceof进行类型检查ClassCastException是运行时异常泛型可以帮助减少类型转换1.4 对象生命周期管理Java虽然自动管理内存但对象生命周期仍需关注// 对象创建过程 1. 分配内存空间 2. 执行父类初始化 3. 初始化实例变量 4. 执行构造方法 // 垃圾回收条件 - 引用计数为零 - 循环引用但不可达内存泄漏常见场景静态集合长期持有对象引用未关闭的IO流/数据库连接监听器未正确注销1.5 综合案例电商系统设计结合今天所学设计一个简易商品管理系统abstract class Product { private String id; private String name; public abstract double calculateTax(); } class Book extends Product { private String isbn; Override public double calculateTax() { return 0.1; // 图书税率10% } } class Electronics extends Product { private int warrantyMonths; Override public double calculateTax() { return 0.2; // 电子产品税率20% } }这个设计体现了抽象类定义通用行为具体类实现差异化逻辑通过多态统一处理不同类型商品1.6 开发工具实战技巧IDEA调试技巧条件断点右键断点设置条件表达式求值AltF8对象标记F3给对象添加标签JShell快速验证jshell String str Hello jshell str.substring(0,3)文档注释规范/** * 计算商品折扣价 * param originalPrice 原价 * param discount 折扣率(0-1) * return 折后价格 * throws IllegalArgumentException 当折扣无效时抛出 */1.7 常见面试问题解析Q重载(Overload)和重写(Override)的区别 A重载发生在同一类中方法名相同但参数不同重写是子类覆盖父类方法要求方法签名完全相同。Q抽象类和接口如何选择 A抽象类适合is-a关系可以包含具体方法接口适合has-a能力Java8后接口也可以有默认实现。Q为什么String要设计为不可变类 A主要考虑安全性如网络连接参数、线程安全性和作为HashMap键的稳定性。今日学习耗时约6小时编写了23个测试类最大的收获是理解了多态在框架设计中的重要性。明天计划学习异常处理机制和集合框架。
