前言
关于abstract关键字,在这个大家比较关注业务实现的时代,真正能够abstract一下的码农又有多少个呢?其实刨除service interface,和service impl。话说这些年的工作经历基本上都是在接口和实现类,进行一些SSH的业务开发,然而这两天真正的看spring的源码,protect abstract 比比皆是,一个功能有N层的继承关系,实现关系,抽象类层出不穷。于是乎回头具体看看abstract的相关信息
简述abstract
用于抽象方法和类,被修饰的类为抽象类,可以有部分实现。被修饰的方法不可以有实现,但是可以被overwrite.在overwrite以后可以进行相应的实现,abstract类不能被实例化,仅仅当非abstract的子类实现了超类的方法之后,才将抽象类的用途彻底铺开,也就是扩展性,以及实现的灵活性,我们称这样的类为具体类、实现类。
abstract类不能修饰被static,private,final修饰的方法,因为被这些修饰符修饰的方法都是不能够被重写,不能被重新实现的。
我理解的abstract应用场景
abstract既然用于抽象类和方法,那么在应用上应该是确定事物有一定行为,但是行为不能具体成某种具体的点,比如MOBA游戏中的施放技能,我们可以统一定义一个超类中的domagic(),在子类中实现4种实现方案,但是他们的行为都是统一的,都是实现施放技能的动作。在设计中,基本上经常应用abstract关键字来层层继承,并且将抽象类分离开来,继承以后搭配相应的其他实现,每个抽象类都负责具体的一个逻辑业务。比如spring的DispatcherServlet真正走到超类到头还是HttpServlet。中间的继承层则走了3层。每一层实现不同的业务逻辑。
abstract和interface的区别
抽象类可以有一些实现,但是interface却一点都不可以有,抽象类可以定义相关变量,但是interface不可以定义。在设计模式中,经常会遇到继承抽象类和实现接口搭配使用的案例。一般接口用搭建接口标准,而abstract类,则是实现阶层中的继承表现。并且配备一些基本实现,可以有逻辑处理。
一个简单的案例
public interface abinter {
void choosehero();
void playmusic();
}
public abstract class abstracttest {
protected abstract void onehit();
protected abstract void onerun();
protected void onemagic(){
System.out.println("this is the method that has impl");
}
}
public abstract class abstractson extends abstracttest implements abinter{
protected abstract void outputson();
}
public class abstract2son extends abstractson{
@Override
protected void outputson() {
System.out.println("this is the first son method!");
}
@Override
protected void onehit() {
System.out.println("this is the father method test class");
}
@Override
protected void onerun() {
}
@Override
public void choosehero() {
}
@Override
public void playmusic() {
}
}