zoukankan      html  css  js  c++  java
  • 初探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中的代码一样可以封装在抽象类中。

  • 相关阅读:
    周记
    读书笔记
    我是一只IT小小鸟
    回车键完全替代模拟鼠标单击事件
    去除Flexgrid表格的隔行底色为白的样式
    Flexgrid中的sortable设为false的时候abbr属性也不存在的原因及解决办法
    Flexigrid列之间的拖拉线条在某些浏览器中不能很好地与栏目边缘重合解决方法介绍
    用基于openssl产生的密钥实现PHP和.NET端的RSA加解密互通
    CSS3轮播图
    淘宝放大镜
  • 原文地址:https://www.cnblogs.com/wxdmw/p/13708161.html
Copyright © 2011-2022 走看看