在开发一个电商后台系统时,经常会遇到商品、订单、用户这些模块有部分功能是重复的。比如每个实体都需要记录创建时间和更新时间。如果每个类都重新写一遍,不仅费劲还容易出错。这时候,Java 的类继承就派上用场了。
什么是类继承
类继承就是让一个类“拿”另一个类的属性和方法,避免重复编码。子类可以拥有父类的功能,还能自己扩展新功能。用关键字 extends 来实现。
public class Product extends BaseEntity {
private String name;
private double price;
// 构造函数
public Product(String name, double price) {
this.name = name;
this.price = price;
}
// getter 和 setter
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
}
上面的 Product 类继承了 BaseEntity,假设这个父类已经封装好了创建时间、更新时间等字段和通用方法,子类直接就能用。
父类怎么写
父类一般会把共用的部分抽出来。比如所有数据库实体都有 ID 和时间戳,那就集中定义。
public class BaseEntity {
protected Long id;
protected long createTime;
protected long updateTime;
public BaseEntity() {
this.createTime = System.currentTimeMillis();
this.updateTime = System.currentTimeMillis();
}
public void updateTimestamp() {
this.updateTime = System.currentTimeMillis();
}
// getter 和 setter
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public long getCreateTime() {
return createTime;
}
public long getUpdateTime() {
this.updateTime = System.currentTimeMillis();
}
}
注意这里用了 protected,这样子类能访问,但外部不能随便改,安全又灵活。
继承的实际好处
项目里一旦有十几个实体类,每个都手动加时间字段和初始化逻辑,改一次就得动十多处。用了继承,改父类一处,所有子类自动生效。省事不说,还减少出错概率。
再比如做图形渲染程序,圆形、矩形、三角形都有“计算面积”的方法。可以把这个方法放在父类 Shape 里声明为抽象方法,强制子类实现,结构清晰,调用统一。
小心别过度继承
不是所有情况都适合继承。比如有个 Vehicle 类,下面分汽车、飞机、轮船。但如果某天要加个“能飞”的功能,飞机合适,汽车不行。这时候用接口(interface)更合适。继承解决的是“是什么”的问题,接口解决“能做什么”。
日常开发中,合理使用继承能让代码更干净,维护起来也轻松。关键是找准共性,把可复用的部分拎出来,别为了继承而继承。