В чем разница между декларацией и определением в Java?
Я очень смущен между этими двумя терминами. Я проверил stackoverflow и есть аналогичный вопрос для C ++, но не для java.
Может ли кто-нибудь объяснить разницу между двумя условиями для java?
- База данных не копирует из активов
- Как создать свою собственную библиотеку для разработки Android, которая будет использоваться в каждой написанной вами программе?
- Как вызвать метод в определенное время в java?
- Вопрос о возврате дизайна Java try-finally
- Событие масштабирования для карт google на Android
- В чем смысл $ в имени переменной?
- Как получить class вызывающего абонента в Java
- Размеры динамических массивов Java?
- Установка Android SDK не находит JDK
- Ограничить десятичные места в Android EditText
- Включить Enum в Java
- Как я могу создать эффект щелчка изображения, как кнопка на Android?
- Почему невозможно открыть закрытый (стандартный) stream?
Концептуальная разница проста:
-
Декларация : вы заявляете , что что-то существует, например, class, функция или переменная. Вы ничего не говорите о том , как выглядит этот class или функция, вы просто говорите, что он существует.
-
Определение . Вы определяете, как что-то реализуется, например, class, функция или переменная, то есть вы говорите, что это на самом деле.
В Java разница между ними невелика, и формально говоря, объявление включает не только идентификатор, но и его определение. Вот как я лично толкую термины в деталях:
-
Классы : Java действительно не разделяет декларации и определения, как это делает C / C ++ (в файлах заголовка и cpp). Вы определяете их в том месте, где вы их объявляете.
-
Функции . Когда вы пишете интерфейс (или абстрактный class), вы можете сказать, что вы объявляете функцию, не определяя ее. Обычные функции, однако, всегда определяются прямо там, где они объявлены. Если хотите, смотрите тело функции как свое определение.
-
Переменные : объявление переменной может выглядеть так:
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 позволяет объявлять участников в любом порядке, нет необходимости в «форвардных объявлениях». Именно в этом контексте необходимо различать два понятия.
- В Java пространство стека, необходимое для переменной, является постоянной времени компиляции, поэтому вычисления смещения стека происходят во время компиляции. (Помните, что в Java массив является ссылкой на объект кучи … и только ссылка хранится в кадре стека).
- То, как Java обрабатывает «определение без инициализации» поля или переменной, не требует отдельной «декларации». Если требуется инициализация переменной, это может произойти в нескольких точках исходного кода.
(Единственное место в Java, где они могли использовать объявление в сравнении с определением, – это абстрактные методы. За исключением того, что если бы они это сделали, ему пришлось бы ссылаться на объявление обычного метода как на определение … для согласованности … и что были бы путаными, поэтому они просто называют «абстрактный» подзаголовок декларацией абстрактного метода.)
C и C ++ обрабатывают эти вещи по-разному и, следовательно , в своих технических описаниях требуются различные термины «объявление» и «определение». Мое определение «Глоссарий Солнца» заключается в том, что они C / C ++ -центрические.
Из определений глоссария Sun :
Объявление: оператор, который устанавливает идентификатор и связывает с ним атрибуты, без необходимости резервирования его хранилища (для данных) или обеспечения реализации (для методов).
определение: декларация, которая резервирует хранилище (для данных) или обеспечивает реализацию (для методов).
То, как я читаю глоссарий Солнца, будет следующим:
List i; // declaration - variable on the stack i = new ArrayList(); // definition - gives variable a reference
1. Декларация означает создание primitive or Object reference variable
, но без присвоения значения или объекта соответственно.
например:
int x; // declaration of x of type int Cat myCat; // declaration of myCat an Object of type Cat
2. Обозначение – это когда мы присваиваем им значения или Объект.
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