Java - 什么是原型?

时间:2013-08-09 23:19:17

标签: java

在关于Java的讲座中,计算机科学教授指出,类的Java接口是公共方法的原型,以及它们的行为描述。

enter image description here
(来源https://www.youtube.com/watch?v=-c4I3gFYe3w @ 8:47)

在视频中的8:13,他说与教学助理一起去讨论部分,了解原型的含义。

"原型"在上面的上下文中是指Java?

7 个答案:

答案 0 :(得分:8)

我认为在这种情况下使用原型这个词是不幸的,像JavaScript这样的语言使用了一种称为原型继承的东西,这与讲座中讨论的完全不同。我认为“合同”这个词会更合适。 Java接口是一种语言特性,它允许类的作者声明该类的任何具体实现将提供在它们实现的任何接口中声明的所有方法的实现。

它用于允许Java类形成多个is-a关系,而不需要求助于多重继承(Java中不允许)。您可以从Car类继承Car类,但实现Product接口,因此Car既是Vehicle又是Product。

答案 1 :(得分:4)

  

在上述背景下,“原型”在Java中意味着什么?

“原型”一词不是标准的Java术语。它未在JLS中使用,Java Tutorial Glossary中未提及。简而言之,没有Java特定的含义。

您的讲师在更广泛的意义上使用这个词,而不是Java特定的意义。实际上,他的用法与this Wikipedia page中描述的“函数原型”匹配。


不幸的是,“IT英语”语言充满了一些例子,其中一个词或短语在不同的语境中意味着不同的(有时是矛盾的)事物。您将在IT中遇到“模板”的其他含义。例如:

  • 在C ++中,“template”指的是Java所谓的泛型类或方法。

  • 在Javascript中,对象具有“模板”属性,可为对象提供方法。

  • 更一般地说,基于模板的打字是进行OO打字的另一种(更动态)方式。

但是这些含义的存在并不意味着你的讲师将接口方法签名称为“模板”是错误的。

答案 2 :(得分:3)

“prototype”不是最佳/正确的终点。 interfaces更像是“契约”,实现类必须实现。

方法的头/定义必须在实现类中实现(在类头/类定义/ implements中使用public class xy implements ...关键字。)

我想这些命名惯例为许多意识形态辩论留下了很大空间。

或者作者有某种精神错乱,并在某种程度上将javascript中的原型继承构造映射到java中。

答案 3 :(得分:2)

接口不是Java中类的原型。

在C& C等语言中C ++,它直接编译为机器代码,编译器应该知道任何标识符(变量/类/函数)的性质,然后才能在程序中的任何位置引用它们。这意味着这些语言需要知道标识符的性质,以生成与其相关的机器代码输出。

简单来说,在代码中的任何地方使用该类之前,C ++编译器应该知道类的方法和成员。要实现这一点,您应该在使用它的代码行之前定义类,或者至少应该声明它的性质。仅声明函数或类的性质会创建“原型”。

在Java中,“接口”类似于类的描述。这定义了特定类的所有方法应该具有的强制性。然后,您可以创建实现这些接口的类。接口在java中服务的主要目的是声明为特定接口类型的Variable可以保存实现该对象的任何类的对象。

答案 4 :(得分:2)

他以C/C++方式告诉它,让我解释一下,在C++中,您可以在类的头文件中定义方法的原型,以便其他类可以识别这些方法,也在{{1}中在没有类概念的情况下,您可以在文件开头定义原型,然后在同一文件中的某个位置实现这些原型,这样即使在提供实现之前也可以使用这些方法。因此,在C接口提供的方式几乎相同,您可以定义将由实现此接口的类实现的方法(方法头)的原型。

答案 5 :(得分:1)

在关于Java的讲座中,计算机科学教授指出:

  

类的Java 接口是:
  1.公共方法的原型,
  2.加上他们的行为描述。

For 1. is ok: - 是的,它们是实现类的公共方法的原型  对于2.这部分可能有点棘手。 :)

  • 为什么?
  • 我们知道:接口定义(包含原型),但没有定义(描述)方法行为。
  • 计算机科学教授说:“......加上对他们行为的描述。”只有当我们查看实现该接口的类(接口实现=原型定义或描述)时,这才是正确的。
  

是的,理解有点棘手:)

参考书目:
Definition vs Description
Context-dependent
Name visibility - C++ Tutorials


ExtraWork:

注意:未经测试,只是想一想! :)

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();
}

答案 6 :(得分:1)

原型提供您将使用的功能的签名 在你的代码中。如果您可以订购,它们有些可选 您的代码,以便您只使用以前的函数 定义然后你可以逃脱而不定义它们

在一个函数的原型下面给出了两个整数的总和。

int add(int a, int b);