在实际项目中运用面向对象的三大特征(封装、继承、多态),核心是通过“抽象共性、隔离变化、提升复用”来设计灵活、可维护的代码。以下结合真实项目场景,说明具体运用方式:
核心目标:让类的“内部实现”与“外部使用”解耦,外部只能通过指定接口操作,避免误修改或依赖细节。
password、phone等属性设为private,禁止外部直接读写。public的setPhone(String phone)方法,在方法内添加校验逻辑(如正则匹配手机号格式),不符合则抛异常。getPhone()方法时,可返回脱敏后的结果(如138****5678),保护隐私。public class User {
private String phone; // 私有属性,外部无法直接访问
private String password;
// 封装手机号设置逻辑(含校验)
public void setPhone(String phone) {
if (phone.matches("^1[3-9]\\d{9}$")) { // 校验手机号格式
this.phone = phone;
} else {
throw new IllegalArgumentException("手机号格式错误");
}
}
// 封装手机号获取逻辑(脱敏)
public String getPhone() {
if (phone == null) return null;
return phone.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
}
}setPhone方法,不影响外部调用。核心目标:提取多个类的共性属性和方法到父类,子类专注于实现自身特有的逻辑,减少重复代码。
Product,封装共性:name、price属性,以及getInfo()(返回商品基本信息)等通用方法。PhysicalProduct继承Product,新增weight属性和calculateFreight()(按重量算运费)方法。VirtualProduct继承Product,无需重写运费方法(或默认返回0),新增validateCode()(校验激活码)方法。// 父类:封装共性
public class Product {
protected String name; // 受保护属性,子类可访问
protected double price;
public Product(String name, double price) {
this.name = name;
this.price = price;
}
public String getInfo() {
return "商品:" + name + ",价格:" + price;
}
}
// 子类1:实体商品(扩展运费逻辑)
public class PhysicalProduct extends Product {
private double weight; // 专属属性
public PhysicalProduct(String name, double price, double weight) {
super(name, price); // 复用父类构造器
this.weight = weight;
}
// 专属方法:计算运费
public double calculateFreight() {
return weight * 8; // 每公斤8元运费
}
}Product并扩展专属逻辑即可。核心目标:用父类/接口定义统一规范,子类实现具体逻辑,调用时无需关心子类类型,直接通过父类引用操作,提升代码灵活性。
Payment,声明统一方法pay(double amount)(支付金额)。WeChatPayment、AlipayPayment)实现Payment接口,各自实现pay方法(如微信调用微信支付API,支付宝调用支付宝API)。Payment类型的参数,调用pay方法即可,无需修改代码就能切换支付方式。// 接口:定义统一支付规范
public interface Payment {
boolean pay(double amount); // 返回支付是否成功
}
// 实现类1:微信支付
public class WeChatPayment implements Payment {
@Override
public boolean pay(double amount) {
System.out.println("调用微信支付接口,扣除" + amount + "元");
return true; // 实际项目中需根据接口返回判断
}
}
// 实现类2:支付宝支付
public class AlipayPayment implements Payment {
@Override
public boolean pay(double amount) {
System.out.println("调用支付宝支付接口,扣除" + amount + "元");
return true;
}
}
// 业务层:订单支付(依赖接口,不依赖具体实现)
public class OrderService {
// 传入Payment接口,支持任何实现类
public void payOrder(Payment payment, double amount) {
if (payment.pay(amount)) {
System.out.println("订单支付成功");
} else {
System.out.println("订单支付失败");
}
}
}
// 调用示例
public class Test {
public static void main(String[] args) {
OrderService service = new OrderService();
// 微信支付
service.payOrder(new WeChatPayment(), 199.9);
// 支付宝支付(无需修改OrderService代码)
service.payOrder(new AlipayPayment(), 299.9);
}
}Payment实现类,业务层代码无需修改,符合“开闭原则”(对扩展开放,对修改关闭)。User类封装用户的角色、权限列表,通过hasPermission(String permission)方法判断是否有权限(隐藏权限校验细节)。BaseUser父类封装共性(用户名、密码),AdminUser、NormalUser子类继承后,分别扩展“管理权限”“普通用户权限”。BaseUser父类引用接收用户对象,调用hasPermission方法时,自动适配子类的权限逻辑(管理员有全部权限,普通用户有限制)。A类需要B类的功能,可在A中定义B的对象,而非继承B)。通过这三大特征的配合,能设计出低耦合、高复用的代码,尤其在中大型项目中,可显著降低维护成本。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。