`Java`中`abstract class`与`interface`区别
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中不能定义任何势实例字段.字段是实现细节,而接口是规则不是事先,在接口中只能定义同时使用static和final声明的常量;- 接口不能实例化,因此不能定义构造函数;
- 接口中可能包含嵌套类型.嵌套类型隐式使用
public和static声明; - 从
Java 8开始,interface中可以包含静态方法.
区别总结
abstract class与interface存在诸多联系,也存在差异.
以下是个人总结的差异支出:
abstract class是class中存在未实现的方法,留待继承的子类实现,interface中的方法则均是未实现的方法(Java 8中interface中的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`区别的更多相关文章
- Java中abstract class 和 interface 的解释和他们的异同点(转)
(一)概述 在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制.正是由于这两种机制的存 在,才赋予了Java强大的 面向对象能力.abstract ...
- 转:Java中abstract和interface的区别
转自:Java中abstract和interface的区别 abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java ...
- 转:二十一、详细解析Java中抽象类和接口的区别
转:二十一.详细解析Java中抽象类和接口的区别 http://blog.csdn.net/liujun13579/article/details/7737670 在Java语言中, abstract ...
- java中Runnable和Callable的区别
文章目录 运行机制 返回值的不同 Exception处理 java中Runnable和Callable的区别 在java的多线程开发中Runnable一直以来都是多线程的核心,而Callable是ja ...
- java中extends与implements的区别
学了java很久了,久不用之后给同学解决一个java问题的时候,就卡在这个标题上了. 下面是java中extends与implements的区别: 1. 在类的声明中,通过关键字extends来创建一 ...
- Java中Comparable和Comparator接口区别分析
Java中Comparable和Comparator接口区别分析 来源:码农网 | 时间:2015-03-16 10:25:20 | 阅读数:8902 [导读] 本文要来详细分析一下Java中Comp ...
- Java中Set Map List 的区别
java中set map list的区别: 都是集合接口 简要说明 set --其中的值不允许重复,无序的数据结构 list --其中的值允许重复,因为其为有序的数据结构 map--成对的数据结构 ...
- Java中this与super的区别【6】
若有不正之处,请多多谅解并欢迎批评指正,不甚感激.请尊重作者劳动成果: 本文原创作者:pipi-changing本文原创出处:http://www.cnblogs.com/pipi-changing/ ...
- Java中堆和栈的区别(转)
栈与堆都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. Java的堆是一个运行时数据区,类的对象从中分配空间.这些对象通过new. ...
随机推荐
- pointnet++之classification/train.py
1.数据集加载 if FLAGS.normal: assert(NUM_POINT<=10000) DATA_PATH = os.path.join(ROOT_DIR, 'data/modeln ...
- openlayers绘制点,线,圆等
由于我的业务需求是可以在底图上进行一些操作,比如绘制电子围栏等功能,于是需要使用openlayers中的画笔功能,接下来开始一波操作 还是上一篇的html页面, 直接上代码 <!doctype ...
- 树莓派安装opencv3及其扩展库
https://www.cnblogs.com/Pyrokine/p/8921285.html 目标编译针对python的opencv以及扩展库 环境树莓派4和3B+都可以python3.7.3 py ...
- Spring 中的异常处理
工作中遇到这样的同事,问他活干完吗,他说开发好了,结果测试时发现各种异常情况未处理,联调测试时各种未知错误,最后联调完成比他预期的两倍工作量还多.这样的开发如果是新人还可以原谅,如果有工作经验且出现多 ...
- vijos2051 SDOI2019 快速查询
题目链接 吐槽 竟然让\(nlog\)的做法卡过去了.. 思路 因为\(1 \le q \le 10^5\),所以可以先对每个标准操作,所操作的位置进行重标号.这样所有的下标都是在\(10^5\)以内 ...
- 第02组 Beta冲刺(4/4)
队名:十一个憨批 组长博客 作业博客 组长黄智 过去两天完成的任务:了解整个游戏的流程 GitHub签入记录 接下来的计划:继续完成游戏 还剩下哪些任务:完成游戏 燃尽图 遇到的困难:没有美术比较好的 ...
- Codechef Chef Cuts Tree
该思博的时候就思博到底,套路的时候不能再套路的一道题 首先我们将联通块的大小平方和进行转化,发现它就等价于连通点对数,而这个可以转化为连接两点的边数(距离)和 所以我们考虑第\(i\)天时,一个点对\ ...
- bcrypt 加密算法
MD5 的特性 MD5 是一种加密算法,在调用这个算法的时候,提供一个密码的明文, 调用的结果,得到一个 32 位长度的密文: MD5 算法的特性:相同的字符串,如果多次调用 md5 算法,得到的结果 ...
- OSG :三维无序离散点构建Delaunay三角网
利用OSG的osgUtil库里面的DelaunayTriangulator类. points是需要构建三角网的点 osgUtil::DelaunayTriangulator* trig = new o ...
- 整理在Spring IOC容器初始化后可以处理特定逻辑的多种实现方式
Spring框架的核心是依赖注入.切面:Spring Boot是在Spring框架的基础上为其提供许多默认配置.默认约定(约定优于配置),从而达到减少或减化配置进而可开箱即用.快速上手:Spring ...
