JAVA关键字abstract

前言

关于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() {
    }
}

猜你喜欢

转载自blog.csdn.net/zhang6622056/article/details/52700885
今日推荐