在一次关于 Java 的讲座中,一位计算机科学教授指出,类的 Java 接口是公共方法的原型,以及对它们行为的描述。
(来源https://www.youtube.com/watch?v=-c4I3gFYe3w @8:47)
在视频中的 8 点 13 分,他说去与助教讨论部分,了解他所说的原型是什么意思。
在上述上下文中,“原型”在 Java 中是什么意思?
在一次关于 Java 的讲座中,一位计算机科学教授指出,类的 Java 接口是公共方法的原型,以及对它们行为的描述。
(来源https://www.youtube.com/watch?v=-c4I3gFYe3w @8:47)
在视频中的 8 点 13 分,他说去与助教讨论部分,了解他所说的原型是什么意思。
在上述上下文中,“原型”在 Java 中是什么意思?
我认为在这种情况下使用原型这个词是不幸的,像 JavaScript 这样的一些语言使用了一种叫做原型继承的东西,这与讲座中讨论的完全不同。我认为“合同”这个词更合适。Java 接口是一种语言特性,它允许类的作者声明该类的任何具体实现都将提供在它们实现的任何接口中声明的所有方法的实现。
它用于允许 Java 类在不诉诸多重继承的情况下形成多个 is-a 关系(在 Java 中不允许)。您可以拥有一个继承自 Vehicle 类但实现 Product 接口的 Car 类,因此 Car 既是 Vehicle 又是 Product。
在上述上下文中,“原型”在 Java 中是什么意思?
“原型”这个词不是标准的 Java 术语。它没有在 JLS 中使用,也没有在Java Tutorial Glossary中提及。总之没有Java特定的含义。
您的讲师在更广泛的意义上使用这个词,而不是在特定于 Java 的意义上使用这个词。事实上,他的用法与此 Wikipedia page中描述的“函数原型”相匹配。
不幸的是,“IT 英语”语言中有很多例子,其中一个单词或短语在不同的上下文中意味着不同的(有时是矛盾的)事物。您会在 IT 中遇到“模板”的其他含义。例如:
在 C++ 中,“模板”指的是 Java 所称的泛型类或方法。
在 Javascript 中,对象有一个“模板”属性,该属性为对象提供方法。
更一般地说,基于模板的类型是进行 OO 类型的另一种(更动态的)方式。
但是存在这些含义的事实并不意味着您的讲师将接口方法签名称为“模板”是错误的。
“原型”不是要使用的最佳/正确的终点。interfaces
更像是“合同”,实现类必须履行。
方法的头/定义必须在实现类中实现(implements
在类头/类定义/中使用关键字public class xy implements ...
)。
我想这种命名约定为许多意识形态辩论留下了很大的空间。
或者作者有某种心理失误,并以某种方式在他的脑海中映射了从 javascript 到 java 的原型继承构造。
接口不是 Java 中类的原型。
在像 C 和 C++ 这样直接编译为机器代码的语言中,编译器应该在任何标识符(变量/类/函数)在程序中的任何位置引用它们之前了解它们的性质。这意味着这些语言需要知道标识符的性质才能生成与其相关的机器代码输出。
简而言之,C++ 编译器应该在代码中的任何位置使用该类之前了解该类的方法和成员。为此,您应该在使用它的代码行之前定义类,或者您至少应该声明它的性质。仅声明函数或类的性质会创建一个“原型”。
在 Java 中,“接口”类似于类的描述。这定义了特定类型的类应该强制具有的所有方法。然后,您可以创建实现这些接口的类。接口在 java 中服务的主要目的是声明为特定接口类型的变量可以保存实现该对象的任何类的对象的可能性。
他说的C/C++
方式,让我解释一下,C++
你可以在类的头文件中为方法定义原型,以便其他类可以识别这些方法,同样在C
没有类概念的地方,你可以在文件开头定义原型然后在同一个文件的某个地方,您可以实现这些原型,以便在提供实现之前就可以使用方法。因此,在Java
接口提供几乎相同的方式中,您可以为方法(方法头)定义原型,这些原型将由实现此接口的类实现。
在一次关于 Java 的讲座中,一位计算机科学教授说:
一个类的Java接口是:
1. 是公共方法的原型,
2. 加上对它们行为的描述。
对于 1. 可以: - 是的,它们是类的已实现公共方法的原型。
对于 2. 这部分可能有点棘手。:)
是的,有点难以理解:)
参考书目:
定义与描述
上下文相关的
名称可见性 - C++ 教程
额外的工作:
注意:未测试,只是思考!:)
C++:
// C++ namespace just with prototypes:
// could be used like interface similar with Java?
// hm, could we then define (describe) prototypes?
// could we then inherit namespace? :)
namespace anIntf{
void politeHello(char *msg);
void bigThankYou();
}
原型提供了您将在代码中使用的函数的签名。它们在某种程度上是可选的,如果您可以订购代码以便只使用之前定义的函数,那么您可以在不定义它们的情况下离开
下面给出了对两个整数求和的函数的原型。
int add(int a, int b);