我正在做一些家庭作业,以前试卷上的一个问题要求命名给定 UML 图中的所有抽象类。相当简单,我想。有一个抽象类和三个接口。一般来说,这些接口是否有资格作为抽象类?
8 回答
问题是,虽然从技术上讲,接口可以用 Java 等语言表示为类,但我不会认为它们是类。
抽象的?当然好。班级?不。
接口不能有构造函数,属性、字段、函数体等也不能。接口不能被继承,它们是被实现的(同样,从技术上讲,实现一个接口实际上可能是用特定语言继承它,但这不是我的意思。)接口更像是“合同”,因为它们没有定义任何行为,例如类。
现在,如果这是一个家庭作业,那么你真的不应该和老师争论这些事情。只需检查您的讲义,看看您的老师对界面的定义中是否提到了“课堂”一词。
所有接口确实是抽象的
实际上,您可以在接口中将方法声明为抽象...除了任何“checkstyle”工具会告诉您抽象关键字是多余的。所有方法都是公开的。
如果一个类实现了一个接口并且没有实现它的所有方法,那么它必须被标记为抽象的。如果一个类是抽象的,它的子类之一应该实现它的未实现的方法。
为了回应其他答案,接口不是类。
接口是一种引用类型,类似于类,只能包含常量、方法签名和嵌套类型。没有方法体。接口不能被实例化——它们只能由类实现或由其他接口扩展。
接口不是类层次结构的一部分,尽管它们与类结合使用。
当您定义一个新接口时,您就是在定义一个新的引用数据类型。您可以在可以使用任何其他数据类型名称的任何地方使用接口名称。如果你定义了一个类型为接口的引用变量,你分配给它的任何对象都必须是实现该接口的类的实例
为了更好地解释为什么接口不是类,请考虑以下内容:
1/ 接口是值使用的类型
2/ 一个类用于对象
3/:
Object a = new Date();
String s = a.toString();
- 变量“a”的类型是 Object(它实际上是 Java 源代码中的类型表示法,表示对 Object 的引用),
- 但它指向的对象的类是日期。
类型(对象)仅影响根据编译器的类型检查哪些代码有效,而不影响代码实际执行的操作。
对象的类会影响代码的作用,因此第二行中的 a.toString() 调用会返回一个看起来像 Date 的字符串,而不是看起来像“java.lang.Object@XXXXXXXX”的字符串。
由于接口是一种类型,它仅用于值,不会代表对象在运行时实际会做什么。
然而,在 Java 中,故事发生了转折——Java 中的所有接口都扩展了 java.lang.Object!尝试添加一个方法:
公共无效通知();
在界面中,看看会发生什么..
扩展类的接口 - 这是否使接口成为类?还是类接口??Uhh-huh .. 猜猜这是为了防止接口覆盖 java.lang.Object 中的定义而不得不做的黑客攻击,接口的实现无论如何都必须扩展。
是的,接口是隐式抽象的。在幕后查看它被编码为.class
文件的方式。
不过,语义是一件有趣的事情。在考试条件下,“抽象类”必须从使用类声明 的.java
源文件中编译出来。abstract class
您只询问了抽象方面,但不要忘记类方面-我不会将接口称为类,因此即使接口是抽象的(根据规范),我仍然认为它们不算数作为抽象类。虽然可能值得明确解释:)
接口包含方法的原型(即声明)而不是定义,但抽象类可以包含方法的定义和至少一个抽象方法(只有原型的方法)
接口用于中断对象继承。它们可以包含多个类和类层次结构的两个或多个对象。将接口视为插座插头。所有实现接口的类都需要有一个接口,就像计算机、咖啡机、通风机和冰箱需要有相同的设备来获取电源一样。
抽象类看起来像接口。抽象类可以有实现,而接口不能有任何实现。
然后,有一个问题。如果抽象类只有方法签名,我们可以将它们称为接口吗?
我认为,与接口不同,抽象类是类。它们使用起来很昂贵,因为当您从抽象类继承一个类时需要进行查找。