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 功能介绍 格局生涯学院官方自媒体。面向互联网人的在线商学院。推送互联网行业知识,培养互联网实操人才。聚焦新行业、新模式、新公司、新人物。…

优化的交换排序(冒泡排序)_C程序实现优化的冒泡排序

优化的交换排序(冒泡排序)Bubble Sort is a simple, stable, and in-place sorting algorithm. Due to its simplicity, it is widely used as a sorting algorithm by computer programmers. 气泡排序是一种简单,稳定且就地的排序算法。 由于其简单性,它…

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

前言对于从事后端开发的同学来说,缓存已经变成的项目中必不可少的技术之一。没错,缓存能给我们系统显著的提升性能。但如果你使用不好,或者缺乏相关经验,它也会带来很多意想不到的问题。今天我们一起聊聊如果在项目中引入了缓存&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)这篇文章我周一发过,但是因为一些"人在江湖、身不由己"的原因,原文删除了,但是很多人找我还是想看看内容…

服务器自动抢占GPU运行程序

其原理是通过nvidia-smi扫描每块显卡上的内存,然后查询已经使用的内存,若已经使用的显卡内存不大于一个阈值,则运行python脚本(你也可以替换成别的命令) #!/bin/bash var0 ocp_memory${2:-500} while [ $var -eq 0 ] …

java range类_Java即时类| range()方法与示例

java range类即时类range()方法 (Instant Class range() method) range() method is available in java.time package. range()方法在java.time包中可用。 range() method is used to get the valid range of values for the given TemporalField. range()方法用于获取给定Temp…

ubuntu安装eclipse

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

java的parse方法_Java即时类| parse()方法与示例

java的parse方法即时类parse()方法 (Instant Class parse() method) parse() method is available in java.time package. parse()方法在java.time包中可用。 parse() method is used to get an Instant that parses the given char sequence and char sequence follow some st…

github果然强大

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

Python用sorted实现argsort

\qquadsorted函数会返回一个可迭代对象经过排序后的迭代器,sorted对于number类型的可迭代对象会按照数值大小排序,对于字符串则按照ASCII码顺序排序,但如果要返回排序的index怎么呢? \qquadsorted有一个功能就是根据key参数比较大…

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

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

c++中cend end_vector :: cend()函数以及C ++ STL中的示例

c中cend endC vector :: cend()函数 (C vector::cend() function) vector::cend() is a library function of "vector" header, it can be used to get the last element of a vector. It returns a const iterator pointing to the past-the-end element of the ve…

alert提示框样式

http://runjs.cn/detail/pembjylb转载于:https://www.cnblogs.com/bky-234/p/4706103.html

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

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

Python | 如何创建模块(模块示例)?

This is an example of creating module in python. Module files are special file that are used as library files and can be accessed in another file. 这是在python中创建模块的示例 。 模块文件是用作库文件的特殊文件,可以在另一个文件中访问。 In this e…

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

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

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

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