Я очень смущен между этими двумя терминами. Я проверил stackoverflow и там аналогичный вопрос для С++, но не для java.
Может кто-нибудь объяснить разницу между двумя терминами для java?
Я очень смущен между этими двумя терминами. Я проверил stackoverflow и там аналогичный вопрос для С++, но не для java.
Может кто-нибудь объяснить разницу между двумя терминами для java?
Концептуальная разница проста:
Декларация: вы заявляете, что что-то существует, например, класс, функция или переменная. Вы не говорите ничего о том, как выглядит этот класс или функция, вы просто говорите, что он существует.
Определение. Вы определяете, как что-то реализуется, например, класс, функция или переменная, то есть вы говорите, что это на самом деле.
В Java разница между ними невелика, и формально говоря, объявление включает не только идентификатор, но и его определение. Вот как я лично подробно интерпретирую термины:
Классы. Java действительно не разделяет декларации и определения, как это делает C/С++ (в файлах заголовка и cpp). Вы определяете их в том месте, где вы их объявляете.
Функции. Когда вы пишете интерфейс (или абстрактный класс), вы можете сказать, что вы объявляете функцию, не определяя ее. Обычные функции, однако, всегда определяются прямо там, где они объявлены. Если хотите, смотрите тело функции как свое определение.
Переменные. Объявление переменной может выглядеть следующим образом:
int x;
(вы заявляете, что существует переменная x
и имеет тип int
), если она является локальной переменной или членом. В Java нет информации о x
для определения, кроме возможных значений, которые она должна содержать, которая определяется назначением для нее.
Вот краткий обзор того, как я использую термины:
abstract class SomeClass { // class decl.
// \
int x; // variable decl. |
// |
public abstract void someMethod(); // function decl. |
// |
public int someOtherMethod() { // function decl. |
// | class
if (Math.random() > .5) // \ | def.
return x; // | function definition |
else // | |
return -x; // / |
// |
} // |
} // /
Спецификация языка Java широко определяет и использует термин "объявление", но не использует "определение", кроме как обычное английское слово.
Мое доказательство состоит в том, что термин "объявление" несколько раз встречается в оглавлении JLS и в указателе, но слово "определение" не встречается ни в одном из них.
Таким образом, когда вы видите, что кто-то использует слово "определение" в контексте Java, они либо используют его в нетехническом смысле, либо не соответствуют своей терминологии.
В последнем случае они могут означать то же самое, что и технический термин "декларация", или они могут означать что-то другое. И если они имеют в виду что-то еще, вы должны спросить их, что они значат. Если они определили это... достаточно справедливо, но это не стандартная терминология.
Ответы, в которых говорится, что "определение" относится к точке, в которой инициализируется переменная, конкретно не поддерживаются... в контексте Java. В Java инициализация переменной происходит либо в точке объявления, либо в более позднем присваивании. В последнем случае специальный термин не используется... или не нужен... кроме присвоения и/или инициализации. Нет определенной точки, в которой хранилище выделено для переменной. Действительно, есть вероятность, что пространство для самой переменной будет выделено до того, как будет достигнуто объявление.
Причина, по которой термин "определение" не используется в Java в спецификации JLS, заключается в том, что он не нужен.
(Единственное место в Java, где они могли бы использовать объявление по сравнению с определением, - это абстрактные методы. За исключением того, что если бы они это сделали, пришлось бы ссылаться на объявление обычного метода как определение... для согласованности... и это Это может сбить с толку. Поэтому они просто называют "абстрактный" регистр объявлением абстрактного метода.)
C и C++ обрабатывают эти вещи по-разному, и, следовательно, в их технических описаниях нужны отдельные термины "декларация" и "определение". Мое определение "солнечного глоссария" заключается в том, что они являются C/C++ -centric.
Из солнечного словаря определений:
Объявление:
Оператор, который устанавливает идентификатор и связывает с ним атрибуты, не обязательно резервируя его хранилище (для данных) или предоставляя реализацию (для методов).
Определение: Объявление, которое резервирует хранилище (для данных) или обеспечивает реализацию (для методов).
То, как я читаю глоссарий Sun, будет таким:
List i; // declaration - variable on the stack
i = new ArrayList(); // definition - gives variable a reference
1. Декларация означает создание a primitive or Object reference variable
, но без присвоения значения или объекта соответственно.
, например:
int x; // declaration of x of type int
Cat myCat; // declaration of myCat an Object of type Cat
2. Defination - это когда мы присваиваем им значения или объект.
int x = 5;
Cat myCat = new Cat();
3. В случае метода, как это...
public abstract void go(); // Method Declaration (Abstract method)
public void go(){ // Method Defination
// Your code
}
Я думаю, что я могу лучше объяснить этот вопрос, например:
Подумайте о следующем сценарии:
В вашей фирме есть новый вакантный пост инженера-программиста. Это означает, что человек, которого вы предпочтете заполнить эту должность, будет инженером-программистом (вы не можете выбрать парня-маркетолога для этого после). Поэтому создание этого сообщения похоже на объявление.
Теперь, когда вы определяете, что человек с этим сообщением может/не может сделать, какие у него есть власти, каковы его ограничения, тогда это называется определением.
Так что говоря
SoftwareEngineer se;
означает декларацию;
и
class SoftwareEngineer {
// define role and responsibilities
}
означает определение. Надеюсь, это поможет вам.
Java
Язык определяет только термин декларация не использует определение.
Декларация:
class A{}// class declaration
String str;// variable declaration
Объявление: оператор, который устанавливает идентификатор и связывает с ним атрибуты, без необходимости резервирования его хранения (для данных) или обеспечения реализации (для методов).
or
1. Declaration means creating a primitive or Object reference variable,
but with no assignment of value or object respectively..
определение. Объявление, которое резервирует хранилище (для данных) или обеспечивает реализацию (для методов).
or
Defination is when we assign values or Object to them.
**Ex:**
List i; // declaration - variable on the stack
i = new ArrayList(); // definition - gives variable a reference
Объявление: указание типа объекта или примитива
Определение: указание значения объекта или примитива
Объявление: указание подписи метода
Определение: указание реализации метода