abstract class

Java中允许使用abstract修饰符声明方法,此时只定义方法但是不实现方法(abstract修饰的方法没有主体,只有一个签名和一个分号).

以下是abstract方法和这些方法所在的abstract类相关的规则:

  • 只要类中有一个abstract方法,那么这个类本身就自动成为abstract,而且必须声明为abstract class,否则会导致编译错误;
  • abstract class无法实例化;
  • abstract类的子类必须覆盖超类的每个abstract方法,并且把这些方法全部实现(即提供方法主体),才能实例化.这种类一般称为具体子类(concrete subclass),目的是强调它不是抽象类.
  • 如果abstract class的子类没有实现集成的所有abstract方法,那么这个子类仍然是abstract class,而且必须使用abstract声明;
  • 使用static,private以及final声明的方法不能是抽象方法,因为这三种方法在子类中不能被覆盖.类似的,final class中不能有任何abstract方法;
  • 就算类中没有abstract方法,这个类也能声明为abstract.使用这种方法声明的abstract类表明类实现的不完善,需要交给子类实现,这种类不能被实例化.

interface

Java的类继承是单继承模式,为了更进一步的面向对象扩展,Java创建了interface概念.

interface的作用只是描绘API,因此,interface提供类型的描述信息,以及实现这个API的类应该提供的方法.

以下是interface相关的规则:

  • interface中所有强制方法都隐式使用abstract声明,不能有方法主体,要使用分号(可以使用abstract修饰符,不过一般省略);
  • 接口定义公开的API.interface中的所有成员都隐式使用public声明,而且习惯省略不必要的public修饰符.如果在接口中使用protected或者private定义方法,会导致编译错误;
  • interface中不能定义任何势实例字段.字段是实现细节,而接口是规则不是事先,在接口中只能定义同时使用staticfinal声明的常量;
  • 接口不能实例化,因此不能定义构造函数;
  • 接口中可能包含嵌套类型.嵌套类型隐式使用publicstatic声明;
  • Java 8开始,interface中可以包含静态方法.

区别总结

abstract classinterface存在诸多联系,也存在差异.

以下是个人总结的差异支出:

  • abstract classclass中存在未实现的方法,留待继承的子类实现,interface中的方法则均是未实现的方法(Java 8interface中的default方法除外);
public interface List<E> extends Collection<E> {
// `interface`中被`default`修饰的方法,提供默认实现
default void sort(Comparator<? super E> c) {
Object[] a = this.toArray();
Arrays.sort(a, (Comparator) c);
ListIterator<E> i = this.listIterator();
for (Object e : a) {
i.next();
i.set((E) e);
}
}
}
  • 子类只能extends单个abstract class,但是可以implements多个interface;
  • abstract class中能声明non final变量(诸如int test;),interface中仅能声明被static final修饰的变量;
  • abstract class中变量可以被private,public以及protected修饰,interface中变量仅能被public修饰;
  • intercae可以extends多个interface,而abstract class可以extends一个类(非限定于abstract class)以及多个interface.

编码使用

在日常的代码编写工作中,选用abstract class或者interface需要慎重.

  • abstract class表示继承关系,继承关系在本质上是"is a"关系;
  • interface则表示具有某种行为关系,是like a关系.

带报警器的门为例,她具有门的作用,也具有报警功能.

  • 继承门(门为abstract class,子类实现开关函数);
  • 实现告警功能(实现告警interface,完成报警函数).

PS:

如果您觉得我的文章对您有帮助,请关注我的微信公众号,谢谢!

`Java`中`abstract class`与`interface`区别的更多相关文章

  1. Java中abstract class 和 interface 的解释和他们的异同点(转)

    (一)概述    在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制.正是由于这两种机制的存 在,才赋予了Java强大的 面向对象能力.abstract ...

  2. 转:Java中abstract和interface的区别

    转自:Java中abstract和interface的区别 abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java ...

  3. 转:二十一、详细解析Java中抽象类和接口的区别

    转:二十一.详细解析Java中抽象类和接口的区别 http://blog.csdn.net/liujun13579/article/details/7737670 在Java语言中, abstract ...

  4. java中Runnable和Callable的区别

    文章目录 运行机制 返回值的不同 Exception处理 java中Runnable和Callable的区别 在java的多线程开发中Runnable一直以来都是多线程的核心,而Callable是ja ...

  5. java中extends与implements的区别

    学了java很久了,久不用之后给同学解决一个java问题的时候,就卡在这个标题上了. 下面是java中extends与implements的区别: 1. 在类的声明中,通过关键字extends来创建一 ...

  6. Java中Comparable和Comparator接口区别分析

    Java中Comparable和Comparator接口区别分析 来源:码农网 | 时间:2015-03-16 10:25:20 | 阅读数:8902 [导读] 本文要来详细分析一下Java中Comp ...

  7. Java中Set Map List 的区别

    java中set map list的区别: 都是集合接口 简要说明 set --其中的值不允许重复,无序的数据结构 list   --其中的值允许重复,因为其为有序的数据结构 map--成对的数据结构 ...

  8. Java中this与super的区别【6】

    若有不正之处,请多多谅解并欢迎批评指正,不甚感激.请尊重作者劳动成果: 本文原创作者:pipi-changing本文原创出处:http://www.cnblogs.com/pipi-changing/ ...

  9. Java中堆和栈的区别(转)

    栈与堆都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆.      Java的堆是一个运行时数据区,类的对象从中分配空间.这些对象通过new. ...

随机推荐

  1. Salesforce 自定义元数据类型

    自定义元数据类型的优点 Salesforce中的设定都是以元数据(Metadata)存在的.在Salesforce中,用户可以新建自定义对象.自定义字段等,这些数据结构都以元数据的形式存储在系统中.当 ...

  2. SQL Server 迁移数据库 (二)分离和附加

    分离和附加其实比导入和导出,步骤要少一些,但是数据量大的话,跨服务器拷贝数据文件可能要慢一些 1. 分离数据库 这里最好选择断开链接,断开之前要确保你记得数据库的路径,一般默认都是C:\Program ...

  3. <Stack> 150 71 388

    150. Evaluate Reverse Polish Notation class Solution { public int evalRPN(String[] tokens) { Stack&l ...

  4. js的call()方法

    // ① 当函数中没有this时,call().apply()和直接执行没有区别 function fn(){ console.log("aaa") } fn() // aaa f ...

  5. [LeetCode] 920. Number of Music Playlists 音乐播放列表的个数

    Your music player contains N different songs and she wants to listen to L (not necessarily different ...

  6. 前后台$.post交互并返回JSON对象

    1.前台代码: $.post(url,{"blogId":blogId},function(reData){ if(reData.state=="success" ...

  7. snowflake ID生成器

    背景 Snowflake 是 Twitter 内部的一个 ID 生算法, 可以通过一些简单的规则保证在大规模分布式情况下生成唯一的 ID 号码. 其组成为: 第一个 bit 为未使用的符号位. 第二部 ...

  8. 【C/C++开发】C++静态库与动态库以及在Linux和Windows上的创建使用

    原文出处: 吴秦的博客    这次分享的宗旨是--让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择.这里不深入介绍静态库.动态库的底层格式,内存布局等,有兴趣的同学 ...

  9. jq数字翻页效果,随机数字显示,实现上下翻动效果

    最近在做一个项目,需要实时展示一串数字,要有类似于日历翻页的效果,在网上找寻了一番,发现dataStatistics这个插件http://www.jq22.com/jquery-info8141能实现 ...

  10. gulp的初阶使用方法(转)

    安装好gulp之后接下来就是使用了,此文主要介绍一些前端开发时常用的一些插件及其用法 http://www.imooc.com/article/tag/26/hot/12插件安装 安装本地服务器插件: ...