初探java顶层抽象
在真正入行以前,我完全没有听过关于顶层抽象的知识,抽象倒是听过,学过接口,也学过抽象类,但在自己练习的时候极少会使用到,最多就是牵出来玩玩。
这也直接导致了前一段时间学习公司的项目非常困难,原因就在于我的抽象思想完全不到位,之前一直听说过所谓接口实际上是一种规范,我的理解是大概这东西就是一种约束,某个类实现了某个接口就要实现其中全部的抽象方法。
这倒是有些强制约束的感觉,但仍旧认识不到它们的作用。直到最近经某位前辈指点和自己的用心钻研,才对接口、抽象类以及顶层抽象这些概念又加深了一些理解,所以将心得体会记录如下,以免忘记。
一、默认方法
默认方法是java8的特性之一,允许在接口内编写方法体,但关键字要求为default。
所以有了默认方法,接口中就不仅仅可以制定规范,在写代码时,一些比较通用的逻辑可以写在默认方法中,而其他比较个性化的部分在接口中可以以抽象方法的形式来表示,举一个简单的例子。
public interface Part { default void print() { before(); System.out.println("比较通用的逻辑"); after(); } /** * 个性化的逻辑 */ public void before(); public void after(); }
名字什么的不要在意,这是一个接口,在print方法中封装的是它的实现类比较通用的逻辑(十个实现类中八个都是相同的逻辑),before和after两个方法是属于实现类比较个性化的方法,不同的实现类有不同的实现方式,所以这部分交由它们自己来实现,下面看一下实现类。
public class PartImpl implements Part { @Override public void before() { System.out.println("个性化前置方法"); } @Override public void after() { System.out.println("个性化后置方法"); } }
实现类实现了接口part,也就具备了接口的默认方法,然后它也实现了前置和后置方法,在通用的逻辑不改变的情况下,完全可以复用接口的默认方法。
测试代码如下:
class Boot { public static void main(String[] args) { Part part = new PartImpl(); part.print(); } }
当然,如果某些实现类不适用封装好的通用默认方法,也可以重写接口的方法。
public class PartImpl implements Part { @Override public void before() { System.out.println("个性化前置方法"); } @Override public void after() { System.out.println("个性化后置方法"); } @Override public void print() { System.out.println("重写后print"); } }
二、实现类区分
关于这一点,在写程序的时候可能体现的不明显,但当后期修改维护的时候,我们可以直接查看有哪些类实现了某个接口,这一点是比较方便的。
当然还有多态这个优势,default中的代码一样可以封装在抽象类中。