2013-08-09 5 views
7

В лекции на Java профессор компьютерных наук утверждает, что интерфейсы Java класса являются прототипами для общедоступных методов, а также описания их поведения.Java - что такое прототип?

enter image description here
(Источник https://www.youtube.com/watch?v=-c4I3gFYe3w @ 8: 47)

И в 8:13 в видео он говорит перейти к дискуссионной секции с ассистентами, чтобы узнать, что он имел в виду прототип.

Что означает «прототип» на Java в приведенном выше контексте?

+6

Не существует ключевого слова прототипа Java. Он говорит прототип в использовании английского языка, то есть модель, из которой можно сделать вещи. – Kon

+2

Он исходит из двух греческих слов: «proto» означает сначала, а «typ» означает модель, которая будет использоваться для создания копий. –

+1

«Прототип» - это не что-то в Java. Вероятно, он ссылается на [концепцию в C/C++/и т. Д.] (Http://en.wikipedia.org/wiki/Function_prototype). –

ответ

2

«прототип» не является лучшим/правильным конечным пунктом для использования. interfaces больше похожи на «контракты», которые должны выполнять реализующие классы.

Головки/определения метода должны быть реализованы в классе реализации (с использованием ключевого слова implements в определении класса/класса класса/public class xy implements ...).

Я предполагаю, что эти соглашения об именах оставляют много места для много идеологических дискуссий.

Или у автора был какой-то ментальный лапс и каким-то образом сопоставил конструкцию прототипического наследования от javascript в java.

7

Я думаю, что использование прототипа слова в этом контексте является неудачным, некоторые языки, такие как JavaScript, используют нечто, называемое прототипическим наследованием, которое совершенно отличается от того, что обсуждается в лекции. Я думаю, что слово «контракт» было бы более уместным. Интерфейс Java - это языковая функция, которая позволяет автору класса объявить, что любые конкретные реализации этого класса будут обеспечивать реализацию всех методов, объявленных в любых интерфейсах, которые они реализуют.

Он используется, чтобы позволить Java-классам формировать несколько отношений is-a, не прибегая к множественному наследованию (не разрешенному на Java). У вас может быть класс Car наследованием класса Vehicle, но он реализует интерфейс Product, поэтому Автомобиль является как Автомобилем, так и Продуктом.

+2

Настоящая «неудача» заключается в том, что «шаблон» законно используется в CS и IT-литературе для обозначения многих разных вещей. Нецелесообразно избегать использования термина целиком, потому что другие люди используют его непоследовательно. –

+0

@BeWarned, слово прототип в этом контексте не печально, как вы говорите. ECMAScript является одним из немногих языков, которые используют прототипное наследование в качестве альтернативы иерархии классов. Слово прототип в этом смысле является «переносом» с языка C, сильно влияющего на Java. В C (и C++, obj-c), поставив прототип функции выше main(), можно вызвать этот код из Main(), но с кодом реализации ниже main(). Фактически в CS, ECE, EE и IT прототип английского слова имеет множество значений в зависимости от контекста, в котором он используется. Это не прискорбно! –

+0

Это не тот прототип неправильный, это просто может привести к путанице, когда эти студенты в конечном итоге подвергаются JavaScript. У людей уже достаточно проблем с пониманием JavaScript OO, не смешивает его, используя это слово при описании Java OO. Особенно, когда есть много других синонимов. – BeWarned

1

Интерфейсы не являются прототипами для классов в Java.

В таких языках, как C & C++, который скомпилирован непосредственно в машинный код, компилятор должен знать природу любого идентификатора (переменной/класса/функций), прежде чем они будут ссылаться в любом месте программы. Это означает, что эти языки требуют знать природу идентификатора для генерации вывода машинного кода, который связан с ним.

Простыми словами, компилятор C++ должен знать методы и член класса перед тем, как этот класс используется в любом месте кода. Чтобы добиться этого, вы должны определить класс перед линией кода, где он используется, или вы должны хотя бы объявить его природу. Объявление только природы функции или класса создает «прототип».

В Java «интерфейс» - это что-то вроде описания класса. Это определяет, какие все методы должны иметь особый тип класса. Затем вы можете создавать классы, которые реализуют этот интерфейс. Основная цель, с которой интерфейсы работают в java, - это возможность того, что переменная, объявленная как конкретный тип интерфейса, может содержать объекты любого класса, который реализует объект.

2

Он говорит это в C/C++ образом, позвольте мне объяснить, в C++ вы можете определить прототипы для методов в заголовочных файлах классов, так что другие классы могут распознавать эти методы, а также в C где нет понятия класса, вы можете определить прототипы в начале файла, а затем где-нибудь в том же файле вы можете реализовать эти прототипы, чтобы методы могли использоваться даже до их реализации. Таким образом, в интерфейсах Java практически одинаково, вы можете определить прототипы для методов (заголовков методов), которые будут реализованы классами, реализующими этот интерфейс.

3

Что означает «прототип» на Java в приведенном выше контексте?

Слово «прототип» не является стандартной терминологией Java. Он не используется в JLS, и он не упоминается в Java Tutorial Glossary. Короче говоря, нет специфического для Java значения.

Ваш лектор использует это слово в более широком смысле, а не в смысле, специфичном для Java. Фактически, его использование соответствует «прототипу функции», как описано в this Wikipedia page.


К сожалению, язык «IT английскому» полон примеров, когда слово или фраза означает разные (и иногда противоречивые) вещи в разных контекстах. Есть другие значения для «шаблона», которые вы встретите в ИТ. Например:

  • В C++ «шаблон» относится к тому, что Java вызывает общий класс или метод.

  • В Javascript объект имеет атрибут «шаблон», который дает методы объектов.

  • В целом, типизация на основе шаблонов является альтернативным (более динамичным) способом ввода OO-ввода.

Но факт, что эти значения существуют, не означает, что ваш лектор ошибочно ссылался на сигнатуры метода интерфейса как «шаблоны».

1

В лекции на Java, профессор компьютерных наук утверждает, что:

Java интерфейсы класса являются:
1. прототипы для публичных методов,
2. плюс описание их поведения.

Для 1. В порядке: - да, это прототипы для реализованных общедоступных методов класса.
Для 2. Эта часть может быть немного сложной. :)

  • Почему?
  • Мы знаем: определение интерфейса (содержит прототипы), но не определяет (описывать) поведение методов.
  • профессор компьютерных наук утверждает: «... плюс описания их поведения».Это правильно, только если мы рассмотрим класс, реализующий этот интерфейс (реализация интерфейса = определения прототипов или описания).

Да, немного сложно понять :)

Библиография:
Definition vs Description
Context-dependent
Name visibility - C++ Tutorials


Дополнительная информация:

Примечание: не проверено, просто подумайте! :)

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

Прототипы обеспечивают подписи функций, которые вы будете использовать в коде. Они несколько по желанию, если вы можете заказать код таким образом, чтобы использовать только функции, которые ранее определены, то вы можете обойтись без определения их

Ниже прототип для функции, которая суммирует два целых числа дано.

int add(int a, int b); 
Смежные вопросы