Java 中接口和抽象类竟然有 7 点不同?

04826d5d14d622587459c4bb00336dae.png

作者 | 磊哥

来源 | Java面试真题解析(ID:aimianshi666)

转载请联系授权(微信ID:GG_Stone)

本文已收录《Java常见面试题》系列:https://gitee.com/mydb/interview

Java 是一门面向对象的编程语言,面向对象的编程语言有四大特征:抽象、封装、继承和多态。而本文介绍的接口和抽象类就是面向对象编程中“抽象”的具体实现,也就是说接口和抽象类都是用来定义实体类的公共行为的,它们是对实体类(对象)更高层次的抽象。

说明:本文以下内容基于 JDK 8 版本。

接口

接口是 Java 语言中的一个抽象类型,用于定义对象的公共行为。它的创建关键字是 interface,在接口的实现中可以定义方法和常量,其普通方法是不能有具体的代码实现的,而在 JDK 8 之后,接口中可以创建 static 和 default 方法了,并且这两种方法可以有默认的方法实现,如下代码所示:

public interface Interface_1 {int count = 1;void sayHi();// default 方法default void print() {System.out.println("Do print method.");}// static 方法static void smethod() {System.out.println("Do static method.");}
}

接下来,创建一个类来实现以上接口:

public class InterfaceImpl_1 implements Interface_1 {@Overridepublic void sayHi() {System.out.println("Hi,I am InterfaceImpl 1.");}public static void main(String[] args) {InterfaceImpl_1 inter = new InterfaceImpl_1();inter.sayHi();// 调用接口中 static 方法InterfaceExample.smethod();// 调用接口中的常量 countSystem.out.println(InterfaceExample.count);}
}

以上程序的执行结果如下:5cb2a1aa517a1c394ddda1b33e948916.png通过上述代码和执行结果我们可以得出以下结论:

  1. JDK 8 中接口可以定义 static 和 default 方法,并且这两种方法可以包含具体的代码实现。

  2. 实现接口要使用 implements 关键字。

  3. 接口不能直接实例化。

  4. 接口中定义的变量默认为 public static final 类型。

  5. 子类可以不重写接口中的 static 和 default 方法,不重写的情况下,默认调用的是接口的方法实现。

抽象类

抽象类和接口类似,它也是用来定义对象的公共行为的,并且它也不能直接实例化,抽象类的实现关键字为 abstract class,子类用 extends 关键字继承父类。抽象类的使用如下:

public abstract class AbstractExample {// 定义普通变量int count = 2;// 定义私有变量private static int total = 10;// 定义抽象方法public abstract void methodA();// 定义普通方法public void methodB() {System.out.println("Hi,methodB.");}
}

接下来使用一个普通类继承上面的抽象类:

public class AbstractSon extends AbstractExample {@Overridepublic void methodA() {System.out.println("Hi,method A.");}public static void main(String[] args) {AbstractSon abs = new AbstractSon();// 抽象类中的变量重新赋值abs.count = 666;System.out.println(abs.count);// 抽象类中的抽象方法abs.methodA();// 抽象类中的普通方法abs.methodB();}
}

以上程序的执行结果如下:8f486633efee6afd878db11251779336.png通过上述代码和执行结果可以得出以下结论:

  1. 抽象类使用 abstract 关键字声明。

  2. 抽象类中可以包含普通方法和抽象方法,抽象方法不能有具体的代码实现。

  3. 抽象类需要使用 extends 关键字实现继承。

  4. 抽象类不能直接实例化。

  5. 抽象类中属性控制符无限制,可以定义 private 类型的属性。

接口和抽象类的区别主要体现在以下 7 个方面。

区别1:定义关键字不同

接口使用关键字 interface 来定义。抽象类使用关键字 abstract 来定义。

区别2:继承或实现的关键字不同

接口使用 implements 关键字定义其具体实现。抽象类使用 extends 关键字实现继承。

区别3:子类扩展的数量不同

接口的实现类可以有多个,如下图所示:9a8f39b23dbfe6fc56dba47eba10958b.png而抽象类的子类,只能继承一个抽象类,如下图所示,继承多个抽象类就会报错:df75fbf8798501a369d23a6eafcbeb58.png在 Java 语言中,一个类只能继承一个父类(单继承),但可以实现多个接口。

区别4:属性访问控制符不同

接口中属性的访问控制符只能是 public,如下图所示:0831dacf3f429be970f8d504004487a4.png

接口中的属性默认是 public static final 修饰的。

抽象类中的属性访问控制符无限制,可为任意控制符,如下图所示:69b83a434543cebcb09fb77f27947dde.png

区别5:方法控制符不同

接口中方法的默认控制符是 public,并且不能定义为其他控制符,如下图所示:8211dac83b47db265ff48c435ff83324.png抽象类中的方法控制符无限制,其中抽象方法不能使用 private 修饰,如下代码所示:dee47d33971963acb3f4b4eacba1253b.png

区别6:方法实现不同

接口中普通方法不能有具体的方法实现,在 JDK 8 之后 static 和 default 方法必须有方法实现,如下代码所示:d59bcd84526c6d6b3c8797869f92752d.png从上述结果可以看出:static 或 default 方法如果没有方法实现就会报错,而普通方法如果有方法实现就会报错。

抽象类中普通方法可以有方法实现,抽象方法不能有方法实现,如下代码所示:79dbd82e2c84d1e9aeedf7e9cfb7a41d.png从上述结果可以看出:抽象类中的普通方法如果没有方法实现就会报错,而抽象方法如果有方法实现则会报错。

区别7:静态代码块使用不同

接口中不能使用静态代码块,如下代码所示:ddeea9622f7b7bad978aa123128c2ffe.png抽象类中可以使用静态代码块,如下代码所示:27ece9b2234616693fb6a68373cb73fe.png

总结

接口和抽象类都是用来定义对象的公共行为的,但二者有以下 7 点不同:

  1. 定义的关键字不同。

  2. 子类继承或实现关键字不同。

  3. 类型扩展不同:抽象类是单继承,而接口是多继承。

  4. 方法访问控制符:抽象类无限制,只是抽象类中的抽象方法不能被 private 修饰;而接口有限制,接口默认的是 public 控制符。

  5. 属性方法控制符:抽象类无限制,而接口有限制,接口默认的是 public 控制符。

  6. 方法实现不同:抽象类中的普通方法必须有实现,抽象方法必须没有实现;而接口中普通方法不能有实现,但在 JDK 8 中的 static 和 defualt 方法必须有实现。

  7. 静态代码块的使用不同:抽象类可以有静态代码块,而接口不能有。

你还知道哪些接口和抽象类的不同?欢迎评论区留言补充。

是非审之于己,毁誉听之于人,得失安之于数。

公众号:Java面试真题解析

52752072b224f61f083942ffd22a5434.gif

往期推荐

0c312239b5b76e05f0b9ecb5ae1b159c.png

面试官:HashSet如何保证元素不重复?


ebb62b0af3c340c94fb23eddfac13a51.png

面试官:如何实现 List 集合去重?


5e7234ee9f7bb24a06025d5f732e6a2d.png

面试官:元素排序Comparable和Comparator有什么区别?


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/544393.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

粉丝不在于多,在于够残

李善友:所有可能被互联网取代的组织一定会被取代 2015-07-30 格局视野 格局视野 格局视野 微信号 geju365 功能介绍 格局生涯学院官方自媒体。面向互联网人的在线商学院。推送互联网行业知识,培养互联网实操人才。聚焦新行业、新模式、新公司、新人物。…

保姆级教学:缓存穿透、缓存击穿和缓存雪崩!

前言对于从事后端开发的同学来说,缓存已经变成的项目中必不可少的技术之一。没错,缓存能给我们系统显著的提升性能。但如果你使用不好,或者缺乏相关经验,它也会带来很多意想不到的问题。今天我们一起聊聊如果在项目中引入了缓存&a…

Fast Global Registration (ECCV 2016) 论文解析

目录0.友情链接1. 论文核心思想1.1. 点云特征匹配1.2. 两个校验1.3. 鲁棒函数与BR对偶1.4.1. Black-Rangarjan Duality (BR对偶性)1.4.2.Derivation of Φρ\Phi_\rhoΦρ​1.4.3.E(T,L)E(\bm{T},L)E(T,L)的优化求解方法4.写在后面0.友情链接 FGR基本介绍 CSDN博客…

系统盘压缩卷小于可用空间_操作系统中的可用空间管理

系统盘压缩卷小于可用空间可用空间管理 (Free space management) As we know that the memory space in the disk is limited. So we need to use the space of the deleted files for the allocation of the new file. one optical disk allows only one write at a time in t…

关于头文件是否参与编译的讨论

一、文章来由 写项目的时候发现了这个问题,又是一个比较底层的问题,首先说明,这篇文章只是我根据查阅的资料和做的实验提出的一个讨论,并不一定就是正确答案。因为这个问题网上众说纷纭,我很欢迎大家参与这个讨论&…

Log4j漏洞?一行代码都不改就能永久修复?

△Hollis, 一个对Coding有着独特追求的人△作者 l Hollis来源 l Hollis(ID:hollischuang)这篇文章我周一发过,但是因为一些"人在江湖、身不由己"的原因,原文删除了,但是很多人找我还是想看看内容…

ubuntu安装eclipse

2019独角兽企业重金招聘Python工程师标准>>> 在Ubuntu 13.04下的安装eclipse 一、eclipse安装过程 首先确保在安装eclipse之前已经安装好Java虚拟机 1. eclipse官网下载压缩包 下载地址:http://www.eclipse.org/downloads/download.php?file/technology…

github果然强大

github果然强大,在idea里写好,可以直接提交到github,在哪台电脑都可以看源码了,手机也可以看 https://github.com/gaojinhua 转载于:https://www.cnblogs.com/gaojinhua/p/4705992.html

保姆级教程,终于搞懂脏读、幻读和不可重复读了!

作者 | 王磊来源 | Java中文社群(ID:javacn666)转载请联系授权(微信ID:GG_Stone)我的文章合集:https://gitee.com/mydb/interview在 MySQL 中事务的隔离级别有以下 4 种:读未提交&am…

保姆级教程,终于搞懂脏读、幻读和不可重复读了!(经典回顾)

作者 | 王磊来源 | Java中文社群(ID:javacn666)转载请联系授权(微信ID:GG_Stone)我的文章合集:https://gitee.com/mydb/interview在 MySQL 中事务的隔离级别有以下 4 种:读未提交&am…

WPF入门教程系列十五——WPF中的数据绑定(一)

使用Windows Presentation Foundation (WPF) 可以很方便的设计出强大的用户界面,同时 WPF提供了数据绑定功能。WPF的数据绑定跟Winform与ASP.NET中的数据绑定功能类似,但也有所不同,在 WPF中以通过后台代码绑定、前台XAML中进行绑定&#xff…

实战,实现幂等的8种方案!

前言 大家好,我是程序员田螺。今天我们一起来聊聊幂等设计。什么是幂等为什么需要幂等接口超时,如何处理呢?如何设计幂等?实现幂等的8种方案HTTP的幂等1. 什么是幂等? 幂等是一个数学与计算机科学概念。在数学中,幂等…

灰度共生矩阵及其数字特征_数字系统及其表示

灰度共生矩阵及其数字特征Any number system has a set of symbols known as Digits with some rules performing arithmetic operations. A collection of these makes a number has two parts. They are integer portion and fraction portion. These portions are separated…

绝绝子,画框架图就用这个工具

前言看过我以往文章的小伙伴可能会发现,我的大部分文章都有很多配图。我的文章风格是图文相结合,更便于大家理解。最近有很多小伙伴发私信问我:文章中的图是用什么工具画的。他们觉得我画的图风格挺小清新的,能够让人眼前一亮。先…

面试官:this和super有什么区别?this能调用到父类吗?

作者:磊哥来源 | Java面试真题解析(ID:aimianshi666)转载请联系授权(微信ID:GG_Stone)本文已收录《Java常见面试题》:https://gitee.com/mydb/interviewthis 和 super 都是 Java 中常…

SpringBoot 热部署神器快速重启的秘密!

今天咱们来聊聊这个热部署神器 spring-boot-devtools 的运行原理,看看它是怎么用这个 ClassLoader 来实现快速重启,帮我们节省时间的!😝文章概要文章的主旋律如下👇spring.factories我们直接打开 spring-boot-devtool…

计算机操作系统 内存_计算机内存的类型| 操作系统

计算机操作系统 内存什么是记忆? (What is Memory?) The essential component of the computer is its Memory. It is assembled on the motherboard as it is a storage device used for storing data and instructions for performing a task on the system. 计算…

关于 java 实现 语音朗读

最近有个java项目要实现 一个 java语音朗读的功能,百度了半天 没有现成的 。也是一头雾水。没具体思路。。。。。大体上总结了下网上的资料 1.java 实现起来 比c或者vb 能麻烦点,或者是这个功能用其他语言完成 然后整合到java 项目里面去!2.…

查询MySQL字段注释的 5 种方法!

作者 | 磊哥来源 | Java中文社群(ID:javacn666)转载请联系授权(微信ID:GG_Stone)很多场景下,我们需要查看 MySQL 中表注释,或者是某张表下所有字段的注释,所以本文就来盘…

聊聊索引失效的10种场景,太坑了

前言今天我接着上一期数据库的话题,更进一步聊聊索引的相关问题,因为索引是大家都比较关心的公共话题,确实有很多坑。不知道你在实际工作中,有没有遇到过下面的这两种情况:明明在某个字段上加了索引,但实际…