Java 接口是抽象类吗?

2022-09-04 06:19:19

我正在完成一些家庭作业,上一篇试卷上的一个问题要求命名给定UML图中的所有抽象类。我想,相当简单。有一个抽象类和三个接口。一般来说,这些接口是否有资格成为抽象类?


答案 1

问题是,虽然从技术上讲,接口可以表示为Java等语言中的类,但我不会将它们视为类。

抽象?地狱是的。类?哈哈

接口不能有构造函数,也不能有属性、字段、函数体等。接口不能被继承,它们是实现的(同样,从技术上讲,实现接口实际上是在特定语言中继承它,但这不是我的观点。接口更像是“契约”,因为它们不像类那样定义任何行为。

现在,如果这是一个家庭作业,那么你不应该真的和老师争论这些东西。只需检查您的讲义,看看“班级”一词是否在老师对界面的定义中被提及。


答案 2

所有界面确实是抽象的

实际上,您可以在接口中将方法声明为抽象方法...除了任何“checkstyle”工具都会告诉你抽象关键字是多余的。所有方法都是公开的。

如果一个类实现了一个接口,但没有实现其所有方法,则必须将其标记为抽象。如果一个类是抽象的,则它的一个子类应该实现其未实现的方法。

为了呼应其他答案,接口不是类

接口是一种类似于类的引用类型,它只能包含常量、方法签名和嵌套类型。没有方法主体。接口不能实例化 — 它们只能由类实现或由其他接口扩展。

接口不是类层次结构的一部分,尽管它们与类结合使用。

定义新接口时,将定义新的引用数据类型。可以在任何可以使用任何其他数据类型名称的位置使用接口名称。如果定义一个引用变量,其类型为接口,则分配给它的任何对象都必须是实现该接口的类的实例


为了更好地解释为什么接口不是类,请考虑以下事项:

1/ 接口是使用的类型

2/ 一个类用于对象

1/x

Object a = new Date();
String s = a.toString();
  • 变量'a'的类型是Object(它实际上是Java源代码中的一种类型符号,意思是对Object的引用),
  • 但它指向的对象的是 Date。

类型(Object)仅根据编译器的类型检查影响哪些代码是有效的,而不是代码实际执行的操作。

对象的类会影响代码的作用,因此第二行中的 a.toString() 调用返回一个看起来像 Date 的字符串,而不是一个看起来像“java.lang.Object@XXXXXXXX”的字符串。

由于接口是一种类型,因此它仅用于值,并且不会表示对象在运行时的实际作用。