Java接口是抽象类吗?

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

事实上,虽然技术上接口可能表示为Java等语言中的类,但我不认为它们是类。

抽象? 当然好。 类? 没有。

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

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

所有界面都是抽象的

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

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

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

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

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

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


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

1 /接口是使用的类型

2 /一个类是对象

3 /:

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

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

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

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

但是在Java中,这是故事的一个转折 – Java中的所有接口都扩展了java.lang.Object! 尝试添加方法:

public void notify();

在一个界面,看看会发生什么..

扩展类的接口 – 是否使接口成为类? 或类接口? 嗯嗯..猜猜这是一个必须要做的黑客攻击,以防止接口覆盖java.lang.Object中的定义,接口的实现无论如何都必须扩展。

你只问过抽象方面,但不要忘记类的一面 – 我不会把接口称为类,所以即使接口是抽象的( 按照规范 ),我仍然认为它们不算数作为抽象类。 可能值得明确解释虽然:)

是的,接口是隐式抽象的。 在幕后查看它编码为.class文件的方式。

语义学是一个有趣的事情; 在考试条件下,“抽象类”必须使用abstract class声明中的abstract class.java源文件中编译。

一个接口包含方法的原型(即声明)而不是defination但Abstract类可以包含方法的定义和至少一个抽象方法(只有原型的方法)

接口用于打破对象inheritance。 它们可以包含两个或多个具有多个类和类层次结构的对象。 将接口看作sockets插头。 实现接口的所有类都需要有一个,就像计算机,咖啡机,呼吸机和冰箱需要使用相同的设备来获取电力一样。

抽象类看起来像接口。 抽象类可以具有实现,其中接口不能具有任何实现。

然后,有一个问题。 如果只有方法签名,我们可以将抽象类称为接口吗?

我认为,与接口不同,抽象类是类。 它们使用起来很昂贵,因为从抽象类inheritance类时会进行查找。