`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. ... 
随机推荐
- VC 静态库与动态库(二)静态库创建与使用
			1.新建项目,创建项目和解决方案 StaticLibrary 这是静态库项目 G:\C++Learn\Library Library文件夹用于存放库相关文件,包含静态库与后面的动态库工程和解决方案 ... 
- shell 大小关系 -eq  -ne
			-eq:等于-ne:不等于-le:小于等于-ge:大于等于-lt:小于-gt:大于 
- 一篇文章搞定git
			git学习 一.背景(当成故事去读) Linus 虽然创建了 Linux,但 Linux 的壮大是靠全世界热心的志愿者参与的,这么多人在世界各地为 Linux 编写代码,那 Linux 的代码是如何管 ... 
- pom文件详解(自己没看过)
			<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ... 
- A1038 Recover the Smallest Number (30 分)
			一.技术总结 此问题是贪心类问题,给出可能有前导零的数字串,将他们按照某个顺序拼接,使生成的数最小. 解决方案,就是使用cmp函数,因为两两字符串进行拼接,进行排序从小到大. 拼接过后会有0可能出现在 ... 
- Python例题集
			例题1:任意输入一组数据比较其最大值并记录输入的数据个数. 源代码: def max(*a): m=a[0] i=0 for x in a: i+=1 if x>m: m=x print('参数 ... 
- java 声明并初始化字符串变量
			public class Sample { public static void main(String[] args) { String str = "Hello world"; ... 
- docker for windows添加卷映射
			docker settings->share drivers 设置共享目录 启动docker时-v 指定目录 ··· docker run -v /d/temp:/app -it --rm co ... 
- 表单只有一项 input 时按回车键会提交表单
			在 Vue 中 使用 Element UI,使用表单 el-form 只有一个 el-input 项,使用 @keyup.enter.native 来处理回车事件. 结果发现按下回车时页面总会 ... 
- Hanlp分词插件docker集群安装
			背景:我是用docker-compose的方式装的es集群,正常情况es镜像没有插件,如果在docker里面用命令安装了那么重启以后又没了,所以采用挂载离线安装的方式 版本: es7.2 1下载Han ... 
 
			
		