`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. ...
随机推荐
- IDEA安装maven和设置自动配置下载包
在我们开发的过程中如果环境配置好了,对于我们开发将优很大作用,减少可开发的时间,接下来我就讲解一下maven的安装和配置,以及在idea上配置,希望此教程同时对大家优帮助. 1.1.下载maven和安 ...
- Ubuntu16.04安装flume
参考:https://www.cnblogs.com/soyo/p/7686702.html
- 关于==和equals的区别和联系,面试这么回答就可以
长篇大论的话,我这里就不多写了,相信大家入门java 的时候就知道个大概了,这里想表述的是,如果面试官问你<关于==和equals的区别>,该怎么回答完美呢?可以这样说 总结的来说: 1) ...
- 跑批 - Spring Batch 批处理使用记录
根据spring官网文档提供的spring batch的demo进行小的测验 启动类与原springboot启动类无异 package com.example.batchprocessing; imp ...
- 题解 P2668 【斗地主】
dfs+简易剪枝+简易a* 思路: dfs+简易剪枝+简易a(我也不知道算不算a): dfs参数记录层数 按消耗牌多少的贪心顺序搜索 有几种情况可以不用搜索(但我还是搜索了) 可以用a*估算出来 最后 ...
- 前端Vue项目——首页/课程页面开发及Axios请求
一.首页轮播图 1.elementUI走马灯 elementUI中 Carousel 走马灯,可以在有限空间内,循环播放同一类型的图片.文字等内容. 这里使用指示器样式,可以将指示器的显示位置设置在容 ...
- python 获取日期以及时间
>>> import datetime >>> >>> i = datetime.datetime.now() >>> prin ...
- Thread&ThreadPool、Parallel、Async和Await用法总结
1.线程和线程池Thread&ThreadPool //线程初始化时执行方法可以带一个object参数,为了传入自定义参数,所以执行需单独调用用于传参. Console.WriteLine(& ...
- k8s-jenkins x CI/CD 动态创建slave---01
jenkins CI/CD(动态创建slave)简述: 由于之前管理kubernetes集群应用发布,用的是Gitlab-CI,用作开发环境管理还可以,生产环境管理发布,缺点太多,打包速度很慢.研究新 ...
- [转帖]mDNS原理的简单理解
mDNS原理的简单理解 https://binkery.com/archives/318.html 发现还有avahi-daemon mdns 设置ip地址 等等事项 网络部分 自己学习的还是不够多 ...