Java接口和抽象类有什么区别

作者:马悦悦 时间:2021-08-21 07:01:18 

接口(interface)和抽象类(abstract class)是支持抽象类定义的两种机制。

接口是公开的,不能有私有的方法或变量,接口中的所有方法都没有方法体,通过关键字interface实现。

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

接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。

除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。

接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。另外,在 Java 中,接口类型可用来声明一个变量,他们可以成为一个空指针,或是被绑定在一个以此接口实现的对象。

抽象类是可以有私有方法或私有变量的,通过把类或者类中的方法声明为abstract来表示一个类是抽象类,被声明为抽象的方法不能包含方法体。子类实现方法必须含有相同的或者更低的访问级别(public->protected->private)。抽象类的子类为父类中所有抽象方法的具体实现,否则也是抽象类。

接口可以被看作是抽象类的变体,接口中所有的方法都是抽象的,可以通过接口来间接的实现多重继承。接口中的成员变量都是static final类型,由于抽象类可以包含部分方法的实现,所以,在一些场合下抽象类比接口更有优势。

相同点:

(1)都不能被实例化

(2)接口的实现类或抽象类的子类都只有实现了接口或抽象类中的方法后才能实例化。

不同点:

(1)接口只有定义,不能有方法的实现,java 1.8中可以定义default方法体,而抽象类可以有定义与实现,方法可在抽象类中实现。

(2)实现接口的关键字为implements,继承抽象类的关键字为extends。一个类可以实现多个接口,但一个类只能继承一个抽象类。所以,使用接口可以间接地实现多重继承。

(3)接口强调特定功能的实现,而抽象类强调所属关系。

(4)接口成员变量默认为public static final,必须赋初值,不能被修改;其所有的成员方法都是public、abstract的。抽象类中成员变量默认default,可在子类中被重新定义,也可被重新赋值;抽象方法被abstract修饰,不能被private、static、synchronized和native等修饰,必须以分号结尾,不带花括号。

(5)接口被用于常用的功能,便于日后维护和添加删除,而抽象类更倾向于充当公共类的角色,不适用于日后重新对立面的代码修改。功能需要累积时用抽象类,不需要累积时用接口。

来源:https://blog.51cto.com/14954398/2554258

标签:Java,接口,抽象,类
0
投稿

猜你喜欢

  • Java面试题及答案集锦(基础题122道,代码题19道)

    2023-11-25 12:36:17
  • Java动态 代理的应用详解

    2023-11-25 08:15:24
  • mybatis-plus查询源码详解

    2023-02-02 11:58:02
  • springboot Interceptor拦截器excludePathPatterns忽略失效

    2023-08-11 19:44:46
  • maven中下载jar包源码和javadoc的命令介绍

    2023-07-27 04:41:01
  • springboot+vue制作后台管理系统项目

    2022-02-26 06:08:37
  • Java @Value("${xxx}")取properties时中文乱码的解决

    2023-08-14 06:25:50
  • Java中的InputStreamReader和OutputStreamWriter源码分析_动力节点Java学院整理

    2022-10-13 10:46:53
  • java.sql.Date和java.util.Date的区别详解

    2023-11-28 16:15:09
  • JAVA JNI函数的注册过程详细介绍

    2023-02-07 18:41:17
  • Java ExecutorService四种线程池使用详解

    2023-05-17 07:12:56
  • 深入解析Java并发程序中线程的同步与线程锁的使用

    2022-03-19 10:25:38
  • mybatis中的count()按条件查询方式

    2022-06-30 06:04:29
  • Java多线程Thread类的使用详解

    2023-11-11 13:08:11
  • Java语言实现简单FTP软件 FTP协议分析(1)

    2023-11-10 17:57:21
  • Java使用二分法进行查找和排序的示例

    2023-03-16 10:16:37
  • Java Thread.currentThread().getName() 和 this.getName()区别详解

    2021-10-31 01:46:18
  • Android自定义TextView跑马灯效果

    2023-08-07 01:14:57
  • springboot cloud使用eureka整合分布式事务组件Seata 的方法

    2023-08-19 13:49:44
  • 浅谈一下Java中的悲观锁和乐观锁

    2023-08-12 05:54:27
  • asp之家 软件编程 m.aspxhome.com