抽象类
- 抽象类
1、在java中 abstract 是抽象的意思,可以修饰类、成员方法
2、abstract 修饰类,这个类是抽象类;abstract 修饰方法,这个方法就是抽象方法
tips:抽象方法 之后方法签名,不能声明方法体
public abstract class Animal{
public abstract void run();
}
-
抽象类的使用场景
1、抽象类可以理解为不完成的设计图,一般作为父类,让之类继承
2、当父类知道子类一定要完成某些行为,但是每个子类该行为的实现又不同,于是该父类就把该行为定义成抽象方法的形式,具体实现交给子类去完成,此时这个类就可以声明成抽象类 -
抽象类的特征
1、类有的成员 (成员变量、方法、构造器),抽象类也都具备
2、抽象类不一定有抽象方法,有抽象方法的类一定是抽象类
3、一个类继承了抽象类,必须重写抽象类的全部抽象方法,否则这个类也必须定义成抽象类
4、不能用abstract 修饰变量、代码块、构造器 -
final 和 abstract 是什么关系
1、是互斥的关系
2、abstract 定义的抽象类作为模版让子类继承,final 定义的类不能被继承
3、抽象方法定义通用功能,让之类重写,final 定义的方法不能被重写 -
实例
public abstract class AbstractTemplate <T> {
protected void validateParam(T request) {
Out.out("father validateParam: " + request.toString());
}
public abstract void doExecute(T req) throws Exception; //抽象方法
public void execute(T req) {
try {
//1.参数校验
validateParam(req);
//2.执行业务逻辑
doExecute(req);
} catch (Exception e) {
// 未知异常处理
Out.out(e);
}
}
public static void main(String[] args) {
AbstractTemplate <String> templateStr = new AbstractTemplate<String>() {
@Override //重写父类的方法
public void validateParam(String str){
super.validateParam(str);
Out.out("child validateParam: " + str);
}
@Override //重写抽象方法
public void doExecute(String req) throws Exception {
Out.out("child doExecute");
}
};
templateStr.execute("ziyuan");
AbstractTemplate<Integer> templateInt = new AbstractTemplate<Integer>() {
@Override //重写父类的方法
public void validateParam(Integer num){
super.validateParam(num);
Out.out("child validateParam: " + num);
}
@Override //抽象方法
public void doExecute(Integer num) throws Exception {
Out.out("child doExecute");
}
};
templateInt.execute(8);
}
}
输出结果:
ziyuan 2023 2023-04-13 16:23:44 father validateParam: ziyuan
ziyuan 2023 2023-04-13 16:23:44 child validateParam: ziyuan
ziyuan 2023 2023-04-13 16:23:44 child doExecute
ziyuan 2023 2023-04-13 16:23:44 father validateParam: 8
ziyuan 2023 2023-04-13 16:23:44 child validateParam: 8
ziyuan 2023 2023-04-13 16:23:44 child doExecute