抽象类(abstract class)
-
什么是抽象类
被abstract关键字修饰的类 -
抽象类产生的原因
随着继承层次中一个个新子类的继承,子类变得越来越具体,而父类则更一般,更通用。
有时将一个父类设计得非常抽象,以至于它不再 被需要创建出具体的实例 -
格式
abstract 修饰
访问控制修饰符 abstract class 类名{ }
-
如何使用抽象类
- 拥有一个或多个抽象方法的类必须是抽象类
- 抽象类中可以有非抽象方法,但是注意2
- 抽象类不能创建实例,但可以声明构造器
抽象方法
-
格式
访问控制修饰符 abstract 返回值类型 方法名(参数列表);
-
如何使用抽象方法
- 子类继承父类后,若重写了父类中“所有”的抽象方法,该类为具体类,可以创建实例
- 子类继承父类后,若没有重写父类中“所有”的抽象方法,该类也必须是抽象类
BB了一大堆,怎么用
-
某种情况下,父类只能知道子类应该具备一个怎样的方法
但是不能明确知道子类要如何实现该方法。那么定义“抽象方法”,由子类各自实现 -
某种情况下,每个子类的一些方法都是确定的,父类则为其实现
当调用时,实则是由子类实例进行调用(abstract class 没实例) -
根据abstract特性,运用于
模板方法设计模式(TemplateMethod)
抽象类体现的就是一种模板模式的设计,抽象类作为多个子类的通用模板
子类在抽象类的基础上进行扩展、改造,但子类总体上会保留抽象类中确定的行为
是设计中常用的设计模式
如下图设计,在AbstractValidateCodeProcessor中,我们可以实现
image.pngcreate 、generate、save、validate
的逻辑,而send
由子类实现各自的逻辑
有些abstarct class一定要子类实现构造函数,怎么做到的
- 因为
- 抽象类不能创建实例,但可以声明构造器
- 抽象父类中声明了有参构造器,并无手动声明无参构造器
-
原理
继承的特性,在说super关键字有提到
若父类中没有提供无参构造器,子类“所有”构造器必须显示调用父类的有参构造器
-
编译错误示例
image.png
- 为什么这样设计,有啥用呢?
当抽象父类中非抽象方法要使用某些属性,而这些属性的值应该由
子类来给来决定
public abstract class AbstractUserDetails<T> {
private static final String HEADER = "Authorization";
private static final String HEADER_FIX = "bearer ";
private SecurityProperties securityProperties;
public AbstractUserDetails(SecurityProperties securityProperties) {
this.securityProperties = securityProperties;
}
public T getUser(HttpServletRequest request) { ....}
}
public class JwtUtils extends AbstractUserDetails<Member> {
private MemberService memberService;
public void setAdminService(MemberService memberService) {
this.memberService = memberService;
}
public JwtUtils(SecurityProperties securityProperties) {
super(securityProperties);
}
@Override
protected Member parserUser(String var) {
return memberService.queryByPhoneOrEmail(var);
}
}
网友评论