每日一道面试题之接口和抽象类有什么区别?

简介: 每日一道面试题之接口和抽象类有什么区别?

解释“接口”和“抽象类”:

在对他们进行比较之前,我们先来解释一下什么是接口?现实世界的接口通常是指两个不同物体之间相互交互所必须通过的一个"中介",没有这个"中介",两者就无法进行交互,我们把这个"中介"称为接口,例如:门窗户,楼道,插孔,电梯间等,但在软件世界中所提到的接口,有狭义和广义之分,狭义的接口是指某个程序设计语言所提供的API,广义的接口是指人与软件交互的图形界面,通过这个图形界面,人们才能使用此软件,JAVA中的接口是一种特殊的类,接口中只能包含常量和抽象方法,属于复合数据类型,是狭义的接口。,关于抽象类的解释大家可以去看这篇文章

相同之处:

1:都包含抽象方法,都不能被实例化

那么接口为什么不能被实例化呢?原因是:接口的定义和类很相似,分为接口声明和接口体两个部分,接口中能够定义的成员只有常量和抽象方法两种(或者两选一),不能包含构造方法,由于接口中只包含抽象方法,这就导致了它不能被实例化的原因和抽象类是相似的,而抽象类不能被实例化的原因我在之前的文章中有总结过,有需要的小伙伴可以去这里

2:他们的对象进行实例化操作的方法相同

无论是接口还是抽象类,虽然自身不能进行实例化操作,但由于抽象类和接口都是引用数据类型,可以声明抽象类和接口类型的引用变量,并将子类的对象实例赋给抽象类和接口变量,因此它们的对象都可利用其自身的多态性向上转型实现对接口或抽象类的实例化操作。对于向上转型这部分知识不懂的小伙可参考这篇文章


不同之处:

1:关键字不同:

对于接口,使用interface修饰接口,它的子类使用implements关键字实现该接口,而对于抽象类,使用abstract用来修饰抽象类,它的子类使用extends关键字继承该抽象类

2:组成不同

在抽象类中可以定义常量,变量,抽象方法,普通方法,构造方法,而对于接口,在java8之前,接口中只能定义抽象方法和全局常量,java8之后,接口中可以定义静态方法,但静态方法必须有方法体。

3:权限不同

抽象类可以使用各种权限,而接口的权限只能是public

4:关系不同

一个抽象类可以实现多个接口,但接口不能继承抽象类可以继承多个接口

5:局限性

由于java单继承的限制,一个子类只能继承一个抽象类,但一个子类可以实现多个接口

相关文章
|
12天前
|
安全 Android开发 Kotlin
Android经典面试题之Kotlin延迟初始化的by lazy和lateinit有什么区别?
**Kotlin中的`by lazy`和`lateinit`都是延迟初始化技术。`by lazy`用于只读属性,线程安全,首次访问时初始化;`lateinit`用于可变属性,需手动初始化,非线程安全。`by lazy`支持线程安全模式选择,而`lateinit`适用于构造函数后初始化。选择依赖于属性特性和使用场景。**
33 5
Android经典面试题之Kotlin延迟初始化的by lazy和lateinit有什么区别?
|
5天前
|
SQL Java Unix
Android经典面试题之Java中获取时间戳的方式有哪些?有什么区别?
在Java中获取时间戳有多种方式,包括`System.currentTimeMillis()`(毫秒级,适用于日志和计时)、`System.nanoTime()`(纳秒级,高精度计时)、`Instant.now().toEpochMilli()`(毫秒级,ISO-8601标准)和`Instant.now().getEpochSecond()`(秒级)。`Timestamp.valueOf(LocalDateTime.now()).getTime()`适用于数据库操作。选择方法取决于精度、用途和时间起点的需求。
17 3
|
12天前
|
Android开发
Android面试题之View的invalidate方法和postInvalidate方法有什么区别
本文探讨了Android自定义View中`invalidate()`和`postInvalidate()`的区别。`invalidate()`在UI线程中刷新View,而`postInvalidate()`用于非UI线程,通过消息机制切换到UI线程执行`invalidate()`。源码分析显示,`postInvalidate()`最终调用`ViewRootImpl`的`dispatchInvalidateDelayed`,通过Handler发送消息到UI线程执行刷新。
20 1
|
2天前
|
消息中间件 调度 Android开发
Android经典面试题之View的post方法和Handler的post方法有什么区别?
本文对比了Android开发中`View.post`与`Handler.post`的使用。`View.post`将任务加入视图关联的消息队列,在视图布局后执行,适合视图操作。`Handler.post`更通用,可调度至特定Handler的线程,不仅限于视图任务。选择方法取决于具体需求和上下文。
11 0
|
9天前
|
Android开发 Kotlin
Android经典面试题之Kotlin中Lambda表达式和匿名函数的区别
**Kotlin中的匿名函数与Lambda表达式概述:** 匿名函数(`fun`关键字,明确返回类型,支持非局部返回)适合复杂逻辑,而Lambda(简洁语法,类型推断)常用于内联操作和高阶函数参数。两者在语法、返回类型和使用场景上有所区别,但都提供无名函数的能力。
10 0
|
21天前
|
存储 算法 Java
Java面试之SpringCloud篇
Java面试之SpringCloud篇
35 1
|
21天前
|
缓存 NoSQL Redis
Java面试之redis篇
Java面试之redis篇
38 0
|
21天前
|
SQL 关系型数据库 MySQL
java面试之MySQL数据库篇
java面试之MySQL数据库篇
24 0
java面试之MySQL数据库篇
|
21天前
|
存储 缓存 前端开发
Java八股文面试之多线程篇
Java八股文面试之多线程篇
30 0
Java八股文面试之多线程篇
|
16天前
|
消息中间件 Java 中间件
Java面试题:解释分布式事务的概念,讨论常见的分布式事务解决方案。
Java面试题:解释分布式事务的概念,讨论常见的分布式事务解决方案。
19 0