接口和抽象类的区别,如何看待?

先看一下例子

接口

public interface PayService{
    public void pay(PayRequest payRequest);
}

抽象类

public abstract class AbstractPayService implements PayService {
    @Override
    public void pay(PayRequest payRequest){
        //前置检查    
        validateRequest(payRequest);
        //支付核心逻辑
        doPay(payRequest);
        //后置处理
        postPay(payRequest);
    }

    public abstract void doPay(PayRequest payRequest);

    private void postPay(PayRequest payRequest){
    //支付成功的后置处理
    }

    public void validateRequest(PayRequest payRequest){
    //参数检查
    }
}

区别如下

  1. 方法定义: 接口和抽象类,最明显的区别就是接口只是定义了一些方法而已,在不考虑Java8中default方法情况下,接口中只有抽象方法,是没有实现的代码的(Java8中可以有默认方法,避免实现类要写一堆的空实现)
  2. 修饰符: 抽象类中的修饰符中可以有public、protected和private和default修饰符,而接口中默认修饰符是public。不可以使用其它修饰符。接口中,如果定义了成员变量,还必须要初始化。
  3. 构造器:抽象类可以有构造器。接口不能有构造器。
  4. 抽象类不能直接被实例化出来,但是构造器也是有意义的,能起到初始化共有成员变量、强制初始化操作等作用
  5. 单继承、多实现:一个类可以实现多个接口,但只能继承一个抽象类。接口不能实现接口,但是可以多重继承其他接口。
    public interface TestService extends InitializingBean,DisposableBean {}
  6. 职责不同:接口和抽象类职责不一。接口主要用于制定规范,从而面向接口编程。而抽象类主要目的是为了复用,比较典型的就是模板方法模式。

一般在实际开发中,我们回先把接口暴露给外部,然后在业务代码中实现接口。如果多个实现类中有相同可复用的代码,则在接口和实现类中间加一层抽象类,将公用部分代码抽出到抽象类中。(后续出一版模板方法模式博文讲述)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值