01、

来看网络上对接口的一番解释:

接口(英文:Interface),在 Java 编程语言中是一个抽象类型,是抽象方法的集合。一个类通过继承接口的方式,从而来继承接口的抽象方法。

兄弟们,你们怎么看,这段解释把我绕得晕乎乎的,好像喝过一斤二锅头。到底是解释抽象类呢还是接口呢?傻傻分不清楚。

搞不清楚要用抽象类还是接口,就先来看看两者之间的区别。来,抽象类和接口,你俩过来比比身高。

  1. 抽象类中的方法可以有方法体,能实现方法具体要实现的功能,但是接口中的方法不行,没有方法体。
  2. 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的,并且是隐式的,缺省的。
  3. 接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法的。
  4. 一个类只能继承一个抽象类,而一个类却可以实现多个接口。

02、

好像知道了两者之间的区别,但印象还是有些模糊。没关系,我们进一步深入。

抽象类

抽象类体现了数据抽象的思想(不然呢),是实现多态的一种机制。抽象类定义了一组抽象的方法,至于这组抽象方法的具体表现形式由子类来继承实现。

抽象类就是用来继承的,否则它就没有存在的任何意义。举个例子,我们来定义一个抽象的作者类。

abstract class Author {
    abstract void write ();     public void sleep () {
        System.out.println("吃饭睡觉打豆豆");
    }
}

作为一名作者,本职工作就是搞写作的,其他时间就吃饭睡觉打豆豆;但至于能写出什么样的作品,就要看是哪一个作者了。比如说,沉默王二能写出的作品一定是幽默风趣的。

public class Wanger extends Author {

    @Override
    void write() {
        System.out.println("沉默王二的作品《Web 全栈开发进阶之路》,读起来轻松惬意");
    } }

注意到了没?抽象类是可以有自己的方法的,但继承它的子类可以忽视。

接口

接口是一种比抽象类更加抽象的“类”,毕竟是用关键字 interface 声明的,不是用 class

接口只是一种形式,就好像一纸契约,自身不能做任何事情。但只要某个类实现了这个接口,就必须按照这纸契约来办事:接口里提到的方法必须全部实现,少一个都不行(抽象类的子类可以忽视非抽象方法)。举个例子,我们来定义一个北航出版合同的接口。

interface ContractBeihang {
    void scriptBeihang();
}

一旦作者签订了合同,那么就必须定期完成一定量的书稿。

public class Wanger extends Author implements ContractBeihang {

    @Override
    void write() {
        System.out.println("作品《Web 全栈开发进阶之路》,读起来轻松惬意的技术书");
    }     @Override
    public void scriptBeihang() {
        System.out.println("一年内完成书稿啊,不然要交违约金的哦。");
    } }

接口是抽象类的补充,Java 为了保证数据的安全性不允许多重继承,也就是说一个类同时只允许继承一个父类(为什么呢?请搜索关键字“菱形问题”)。

但是接口不同,一个类可以同时实现多个接口,这些接口之间可以没有多大的关系(弥补了抽象类不能多重继承的缺陷)。比如说,沉默王二不仅签了北航出版社的合同,还和 51CTO 签了付费课程的合同。

public class Wanger extends Author implements ContractBeihang, Contract51 {

    @Override
    void write() {
        System.out.println("作品《Web 全栈开发进阶之路》,读起来轻松惬意的技术书");
    }     @Override
    public void scriptBeihang() {
        System.out.println("一年内完成书稿啊,不然要交违约金的哦。");
    }     @Override
    public void script51() {
        System.out.println("王老师,先把 Java 云盘的大纲整理出来。");
    } }

03、

通过上面举的例子,是不是对接口和抽象类有比较清晰的认知了?如果还没有,来来来,我们再来比较一下接口和抽象类之间的差别。

究竟什么时候使用接口,什么时候使用抽象类呢?

1、抽象类表示了一种“is-a”的关系,而接口表示的是“like-a”的关系。也就是说,如果 B 类是 A(沉默王二是一个作者),则 A 应该用抽象类。如果 B 类只是和 A 有某种关系,则 A 应该用接口。

2、 如果要拥有自己的成员变量和非抽象方法,则用抽象类。接口只能存在静态的不可变的成员变量(不过一般都不在接口中定义成员变量)。

3、为接口添加任何方法(抽象的),相应的所有实现了这个接口的类,也必须实现新增的方法,否则会出现编译错误。对于抽象类,如果添加了非抽象方法,其子类却可以坐享其成,完全不必担心编译会出问题。

4、抽象类和接口有很大的相似性,请谨慎判断。Java 从1.8版本开始,尝试向接口中引入了默认方法和静态方法,以此来减少抽象类和接口之间的差异。换句话说,两者之间越来越难区分了。

04、

在实际的开发应用当中,抽象类我用得不多(这可真是大实话);接口我倒是用得蛮多的,就像下面这样子:

public interface CityMapper {

    @Select("select * from city")
    List<City> getCitys(); }

@Insert@Update@Delete@Select 被称为 Mybatis 的注射器注解。

是不是突然感觉有点懵?之前还在谈接口和抽象类,怎么一下子跳跃到 Mybatis 上面了呢?还有什么映射器注解?

嗯,这就对了。所有的理论知识都要应用于实践,否则也就没有了存在价值。在我的实践应用当中,接口用得最多的就是 MybatisMapper 接口。

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解(就是你在前面见到的增删改查四大注解)来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

当我们配置好了 MyBatis 环境后,可以直接通过以下语句来调用注射器接口。

@Service
public class CityService {
    @Autowired
    private CityMapper cityMapper;     public void init() {
            List<City> citys = cityMapper.getCitys();
        }
    }
}

在注射器接口中,也只会存在那些与数据库查询相关的抽象方法,就像你看到的 List<City> getCitys();。一个注射器接口 + 注射器注解就可以增删改查数据库,是不是感觉很神奇?

05、

这篇文章的目的是帮助更多的读者了解和掌握抽象类、接口的特点,以及不同的使用场景,通过我整篇文章的努力,我相信你一定若有所获——这也是我写作的最强动力。最后,感谢各位的阅读哦。

Java:接口和抽象类,傻傻分不清楚?的更多相关文章

  1. java 接口和抽象类的区别

    java 接口和抽象类的区别抽象类:1.含有抽象方法的类一定为抽象类,反过来抽象类,不一定含有抽象方法:2.抽象类必须用abstract来进行定义,抽象方法也必须用abstract来进行定义:3.抽象 ...

  2. 初探设计:Java接口和抽象类何时用?怎么用?

    今天犯了个错: “接口变动,伤筋动骨,除非你确定只有你一个人在用”.哪怕只是throw了一个新的Exception.哈哈,这是我犯的错误. 一.接口和抽象类 类,即一个对象. 先抽象类,就是抽象出类的 ...

  3. Java接口和抽象类有什么区别,哪些时候用接口,哪些时候用抽象类?

    Java接口和抽象类有什么区别,哪些时候用接口,哪些时候用抽象类? 2013-01-05 17:16:09|  分类: JAVA |  标签:java  |举报|字号 订阅     下面比较一下两者的 ...

  4. Java接口和抽象类的区别

    今天看到项目中,写了一个抽象类,里面有很多方法继承了这类,当调用这个接口时,采用的是这个抽象类去调方法的,当时一想,这个不就是我们说的Java的多态的特征: 继承:存在继承关系的子类和父类 重写:子类 ...

  5. java接口和抽象类

    关于接口 1.创建一个接口,需要使用interface关键字. 2.实现一个接口,需要使用implements关键字. 3.接口的成员属性都是静态常量(默认public static final). ...

  6. java接口与抽象类的区别

    接口可以是标志接口,里面没有任何常量和方法. 抽象类不一定必须有抽象方法,也可也没有方法,但含抽象方法的类必须被声明为抽象类. 在抽象层次结构中,Java接口在最上面,然后紧跟着抽象类,然后是一般类. ...

  7. Java接口和抽象类的实现方法

    一.java中的接口本质上是加约束的抽象类 //抽象类 public abstract class AExample { public abstract int add(int x,int y); p ...

  8. Java 接口和抽象类差别

    原文:http://blog.csdn.net/sunboard/article/details/3831823 1.概述 一个软件设计的好坏,我想非常大程度上取决于它的总体架构,而这个总体架构事实上 ...

  9. Java接口和抽象类的理解

    接口和抽象类的相同之处就是 都会有抽象方法 抽象方法就是一个没有方法体 等待继承的子类完成的方法 然而接口比较严格 它的方法必须是抽象方法且是公开的 抽象类 可以有自己的属性 和 实体方法 首相用面向 ...

随机推荐

  1. javaXML文件的写入之DOM和DOM4J

    1.DOM篇 首先是DOM的操作方法,字符串数据可以从对象中读,例如上篇提到的Person对象,这里为了方便直接手写. package com.dom.node; import javax.xml.p ...

  2. java基本数据类型及其包装类

    1.String类 String s1 = "hello world"; String s2 = "hello world"; String s3 = s1 + ...

  3. 强大的代码编辑器 phpstorm version 2016.2 License Server激活

    "磨刀不误砍柴工","工欲善其事必先利其器",找个一个好的代码开发编辑工具可以让我们事半功倍,并且代码质量得到保障,在这里就推荐一款强大的代码编辑器,不对其实可 ...

  4. 在Web中获取MAC地址

    很多时候都很难琢磨客户在想什么,也许是自己业务经验不足,也许是客户要显示出他在软件方面也非常的专业.记得以前听过一个故事,说一个富人想娶个媳妇,然后他比较钟意的有三个女人,然后就想从三个女人中选一个, ...

  5. Scrapy爬虫框架补充内容一(Linux环境)

    Scrapy爬虫框架结构及工作原理详解 scrapy框架的框架结构如下: 组件分析: ENGINE:(核心):处理整个框架的数据流,各个组件在其控制下协同工作 SCHEDULER(调度器):负责接收引 ...

  6. PAT1043:Is It a Binary Search Tree

    1043. Is It a Binary Search Tree (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN ...

  7. sap 内表

    内表的目的在ABAP/4中,主要使用表格.表格是R/3系统中的关键数据结构.长期使用的数据存储在关系数据库表格中.关于如何读取和处理数据库表格的详细信息,参见读取并处理数据库表.除了数据库表格,还可以 ...

  8. 小苹果WP(实验吧-隐写术)

    本文由荒原之梦原创,原文链接:http://zhaokaifeng.com/?p=706 前言:本文是实验吧训练题库里隐写术部分的一道题:"小苹果"的Write Up. 题目链接: ...

  9. 关于基线baseline及与inline-block、vertical-aline等属性的关系(完善中.......)

    1. 基本含义 基线(base line):而是英文字母x的下端沿,是a,c,z,x等字母的底边线,并不是汉字文字的下端沿,.下图的红色线即为基线.凡是涉及到垂直方向的排版或者对齐的,都离不开最最基本 ...

  10. cassandra 在window上的demo

    Cassandra   window使用 1.        下载:http://cassandra.apache.org/download/. 2.        解压后,bin目录下,cassan ...