在实际项目中运用继承的核心是“提取共性、复用代码、分层扩展”,避免重复开发并让代码结构更清晰。以下结合具体场景说明继承的合理用法、注意事项及最佳实践:
继承的本质是“子类是父类的一种特殊类型”(如“学生是一种人”“轿车是一种交通工具”),此时适合将共性抽离到父类。
系统中有“管理员”“普通用户”“访客”三类用户,均需管理“账号、密码、创建时间”等基础信息,但权限和操作不同。
实现方式:
BaseUser,封装所有用户的共性: username(账号)、password(密码)、createTime(创建时间) login()(登录逻辑)、getUserInfo()(获取基础信息) AdminUser:新增deleteUser()(删除用户权限)、updateSystemConfig()(修改系统配置)方法 NormalUser:新增updatePersonalInfo()(修改个人信息)、viewData()(查看数据)方法 GuestUser:重写login()(限制登录时长),仅保留viewPublicData()(查看公开数据)方法 // 父类:封装共性
public class BaseUser {
protected String username;
protected String password;
protected LocalDateTime createTime;
public BaseUser(String username, String password) {
this.username = username;
this.password = password;
this.createTime = LocalDateTime.now(); // 统一初始化创建时间
}
// 共性方法:登录逻辑
public boolean login(String inputPwd) {
return this.password.equals(inputPwd);
}
// 共性方法:获取基础信息
public String getUserInfo() {
return "账号:" + username + ",注册时间:" + createTime;
}
}
// 子类:管理员(扩展权限)
public class AdminUser extends BaseUser {
public AdminUser(String username, String password) {
super(username, password); // 复用父类构造器初始化共性属性
}
// 管理员专属方法:删除用户
public void deleteUser(String userId) {
System.out.println("管理员" + username + "删除了用户:" + userId);
}
}效果:
BaseUser并扩展,无需修改父类 继承不仅是复用,更要允许子类根据自身需求修改父类的行为(即“重写”),这是继承灵活性的核心。
父类Product有matchKeyword(String keyword)方法(判断商品是否匹配搜索关键词),子类根据类型重写逻辑:
Book:匹配“书名、作者、出版社” Electronic:匹配“品牌、型号、功能描述” // 父类:定义基础匹配逻辑
public class Product {
protected String name;
public Product(String name) {
this.name = name;
}
// 父类基础匹配:仅匹配名称
public boolean matchKeyword(String keyword) {
return name.contains(keyword);
}
}
// 子类:图书(扩展匹配逻辑)
public class Book extends Product {
private String author;
private String publisher;
public Book(String name, String author, String publisher) {
super(name);
this.author = author;
this.publisher = publisher;
}
// 重写:图书需匹配名称、作者、出版社
@Override
public boolean matchKeyword(String keyword) {
return super.matchKeyword(keyword) // 复用父类的名称匹配
|| author.contains(keyword)
|| publisher.contains(keyword);
}
}效果:
matchKeyword(),自动适配子类逻辑(多态的基础) A → B → C → D,层级超过3层会导致代码耦合严重,修改父类可能影响所有子类。undefined解决:控制继承层级(建议≤2层),用“组合”代替部分继承(如D需要B的功能,可在D中定义B的对象,而非继承C)。PaymentRecord继承Order,会导致属性冗余(如订单号、金额重复)。undefined解决:仅在明确“子类是父类的一种”时使用继承,否则用组合(Order中包含PaymentRecord对象)。public修饰属性,子类可直接修改,破坏封装(如BaseUser的password设为public,子类可能绕过校验直接修改)。undefined解决:父类属性用private,通过protected的getter/setter提供可控访问,子类需修改时调用方法(含校验逻辑)。在框架和设计模式中,继承常与“模板方法模式”“工厂模式”配合,提升扩展性:
exportData()包含“查询→处理→导出”步骤),子类重写具体步骤(如ExcelExport重写“导出”为Excel格式,PdfExport重写为PDF格式)。 ProductFactory定义createProduct()方法,子类BookFactory、PhoneFactory分别创建对应商品对象,调用方通过父类工厂获取对象(多态+继承)。记住:继承是“白箱复用”(子类能访问父类实现细节),需谨慎设计父类接口,避免因父类修改导致子类崩溃。在实际项目中,“组合优于继承”是更通用的原则,但合理的继承仍是简化代码的重要手段。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。