基础知识:抽象类成员变量的继承与使用
抽象类成员变量的继承与使用
在Java面向对象编程中,子类会自动继承父类(包括抽象类)的所有成员变量(字段)和方法,无论这些成员是公共的(public
)、受保护的(protected
)还是默认的(包级私有)。
关于继承的关键点:
- 访问修饰符的影响:
public
:子类可直接访问protected
:子类可直接访问(即使不在同一包中)- 默认(无修饰符):子类必须在同一包中才能访问
private
:子类无法直接访问(但可通过父类的公共方法间接访问)
- 原理:
- 当创建子类实例时,会先调用父类的构造函数初始化父类部分
- 子类实例包含父类的所有成员变量和方法
- 继承关系允许子类重用父类的代码,避免重复实现
示例
public abstract class IStringRedisService<T> {@Autowiredprotected RedisTemplate<String, Object> redisTemplate;@Resourceprotected ValueOperations<String, T> valueOperations;// ...其他方法
}@Component
public class DeviceCache extends IStringRedisService<Device> {// 子类可以直接使用父类的 redisTemplate 和 valueOperationspublic void someMethod() {// 直接调用父类的成员变量valueOperations.set(key, value);redisTemplate.expire(key, time, unit);}
}
示例中,通过继承IStringRedisService
获得了:
redisTemplate
:用于执行Redis命令(如expire
、getExpire
)valueOperations
:用于操作Redis中的值(如set
、get
)
这些成员变量能够在子类中直接操作Redis缓存,而无需重新注入或初始化它们。
最佳实践建议:
-
使用protected而非private:
- 如果希望子类能够直接访问成员变量,建议使用
protected
而非private
- 这符合"开放-封闭"原则,允许扩展但限制修改
- 如果希望子类能够直接访问成员变量,建议使用
-
封装复杂操作:
- 对于常用的Redis操作,可以在父类中封装为方法,子类直接调用
- 例如:父类提供
refreshExpire
方法,子类只需传入参数即可
-
重写方法:
- 如果父类方法的行为不完全符合子类需求,可以在子类中重写该方法
- 例如:子类可以重写
put
方法,添加自定义逻辑