1. 面向对象编程的本质理解
第一次接触Java时,我被教科书上"万物皆对象"的说法弄得一头雾水。直到在电商项目里设计商品系统时,突然意识到:每个SKU不就是一个天然的对象吗?它有颜色、尺寸、价格等属性,能进行上下架、改价等操作。这种将现实事物抽象为代码实体的思维方式,就是面向对象(OOP)的核心。
关键认知:OOP不是语法规则集合,而是一种用代码模拟现实世界的思维范式。就像乐高积木,对象是基本构建单元,通过组合和交互完成复杂系统。
2. 类与对象的实战解析
2.1 类的定义艺术
定义类就像设计产品模具。以银行账户为例:
java复制public class BankAccount {
// 字段设计要点:private保护 + 明确数据类型
private String accountNumber; // 账户编号不可变
private double balance; // 精确到分用BigDecimal更佳
// 构造器黄金法则:参数校验 + 完整初始化
public BankAccount(String accountNumber, double initialBalance) {
if(initialBalance < 0) {
throw new IllegalArgumentException("初始余额不能为负");
}
this.accountNumber = accountNumber;
this.balance = initialBalance;
}
// 方法设计范式:单一职责 + 边界检查
public void deposit(double amount) {
if(amount <= 0) {
throw new IllegalArgumentException("存款金额必须为正");
}
balance += amount;
}
}
避坑指南:
-
字段初始化的三种方式:
- 声明时初始化(适合默认值)
- 构造器初始化(强制要求的值)
- 初始化块(复杂逻辑)
-
方法签名设计原则:
- 动词开头(getXxx是历史包袱)
- 参数不超过3个(过多考虑用对象包装)
- 返回Optional替代null
2.2 对象生命周期管理
java复制// 对象创建的三重境界
BankAccount account1 = new BankAccount("622202", 1000); // 标准创建
BankAccount account2 = AccountFactory.createVIPAccount(); // 工厂模式
try(BankAccount account3 = new AutoCloseableAccount()) { // 资源管理
// 自动关闭实现AutoCloseable
}
内存管理真相:
- 对象在堆内存中,引用变量在栈内存
- GC主要回收条件:无引用可达
- 内存泄漏典型场景:
java复制// 静态集合持续增长 private static List<byte[]> cache = new ArrayList<>(); void addToCache() { cache.add(new byte[1024*1024]); // 1MB每次 }
3. 面向对象三大特性深度实践
3.1 封装的安全之道
真正的封装不是简单的private+getter/setter,而是业务规则的强制约束:
java复制public class Temperature {
private double celsius;
public double getFahrenheit() {
return celsius * 1.8 + 32;
}
public void setFahrenheit(double fahr) {
this.celsius = (fahr - 32) / 1.8;
}
// 业务规则:绝对零度限制
public void setCelsius(double celsius) {
if(celsius < -273.15) {
throw new IllegalArgumentException("低于绝对零度");
}
this.celsius = celsius;
}
}
封装进阶技巧:
- 防御性拷贝:
java复制private Date birthDate; public Date getBirthDate() { return (Date) birthDate.clone()
解锁全文
加入我们的会员,获取最新、最热、最精彩的开发者技术内容