初探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中的代码一样可以封装在抽象类中。

原文地址:https://www.cnblogs.com/wxdmw/p/13708161.html