抽象类与接口的异同及实践
一、相同点
都不能被实例化
二、不同点
抽象类可以定义具体的方法,(jdk8以后,接口也是可以定义具体的方法的,必须有default关键字)
接口是implements,抽象类是extends
设计理念不同,接口是“has-a”,抽象类是"is-a"
抽象类可以有构造器,接口没有,抽象类的构造方法是不能直接实例化的,但是一旦一个具体的类继承了抽象类,那么就可以在子类中调用抽象类的构造方法。
参考:抽象类与接口的区别
三、实践
接口一般是用来定义一系列规范。
抽象类除了上面的功能还有就是实现某些公共的子类需要的方法。
在实际的使用中,用到的都很多,这里以RocketMQ一段源码来阐述,在RocketMQ中底层通信是利用Netty来做的。继承图如图:
其中RemotingService接口定义了基本的start(),shutdown(),registerRPCHook()方法,分别是启动服务,关闭服务,Jvm关闭回收资源方法。
RemotingServer和RemotingClient定义了下面集成需要实现的一些方法,主要是同步请求,异步请求等。
NettyRemotingServer和NettyRemotingClient是具体的实现类,主要是实现上面的接口,一个是接收和处理进来的请求,一个对服务端进行请求。
NettyRemotingAbstract是抽象类,其中定义了具体的子类方法,还有缓存对外的请求,注册请求处理器和RPC处理器等。也是实现了同步请求,异步请求等公共方法,所以在NettyRemotingServer和NettyRemotingClient的公共方法和实现都放在了该接口中。
具体的可以翻阅RocketMQ源码查看,这里可以简单总结抽象类主要是提供公共实现,而接口主要是进行规范和对外提供标准服务。