В чем разница между декларацией и определением в Java?

Я очень смущен между этими двумя терминами. Я проверил stackoverflow и там аналогичный вопрос для С++, но не для java.

Может кто-нибудь объяснить разницу между двумя терминами для java?

Ответ 1

Концептуальная разница проста:

  • Декларация: вы заявляете, что что-то существует, например, класс, функция или переменная. Вы не говорите ничего о том, как выглядит этот класс или функция, вы просто говорите, что он существует.

  • Определение. Вы определяете, как что-то реализуется, например, класс, функция или переменная, то есть вы говорите, что это на самом деле.

В 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;                    // /                         |
                                          //                           |
    }                                     //                           |
}                                         //                          /

Ответ 2

Спецификация языка Java широко определяет и использует термин "объявление", но не использует "определение", кроме как обычное английское слово.

Мое доказательство состоит в том, что термин "объявление" несколько раз встречается в оглавлении JLS и в указателе, но слово "определение" не встречается ни в одном из них.

Таким образом, когда вы видите, что кто-то использует слово "определение" в контексте Java, они либо используют его в нетехническом смысле, либо не соответствуют своей терминологии.

В последнем случае они могут означать то же самое, что и технический термин "декларация", или они могут означать что-то другое. И если они имеют в виду что-то еще, вы должны спросить их, что они значат. Если они определили это... достаточно справедливо, но это не стандартная терминология.


Ответы, в которых говорится, что "определение" относится к точке, в которой инициализируется переменная, конкретно не поддерживаются... в контексте Java. В Java инициализация переменной происходит либо в точке объявления, либо в более позднем присваивании. В последнем случае специальный термин не используется... или не нужен... кроме присвоения и/или инициализации. Нет определенной точки, в которой хранилище выделено для переменной. Действительно, есть вероятность, что пространство для самой переменной будет выделено до того, как будет достигнуто объявление.


Причина, по которой термин "определение" не используется в Java в спецификации JLS, заключается в том, что он не нужен.

  • Поскольку Java позволяет объявлять членов в любом порядке, нет необходимости в "предварительных объявлениях". В этом контексте необходимо различать эти два понятия.
  • В Java пространство стека, требуемое для переменной, является постоянной времени компиляции, поэтому вычисления смещения стека происходят во время компиляции. (Помните, что в Java массив является ссылкой на объект кучи... и в кадре стека содержится только ссылка.)
  • Способ, которым Java обрабатывает "определение без инициализации" поля или переменной, не требует единой точки "объявления". Если требуется инициализация переменной, это может произойти в нескольких точках исходного кода.

(Единственное место в Java, где они могли бы использовать объявление по сравнению с определением, - это абстрактные методы. За исключением того, что если бы они это сделали, пришлось бы ссылаться на объявление обычного метода как определение... для согласованности... и это Это может сбить с толку. Поэтому они просто называют "абстрактный" регистр объявлением абстрактного метода.)

C и C++ обрабатывают эти вещи по-разному, и, следовательно, в их технических описаниях нужны отдельные термины "декларация" и "определение". Мое определение "солнечного глоссария" заключается в том, что они являются C/C++ -centric.

Ответ 3

Из солнечного словаря определений:

Объявление: Оператор, который устанавливает идентификатор и связывает с ним атрибуты, не обязательно резервируя его хранилище (для данных) или предоставляя реализацию (для методов).

Определение: Объявление, которое резервирует хранилище (для данных) или обеспечивает реализацию (для методов).

То, как я читаю глоссарий Sun, будет таким:

List i;              // declaration - variable on the stack  
i = new ArrayList(); // definition - gives variable a reference

Ответ 4

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      

    }

Ответ 5

Я думаю, что я могу лучше объяснить этот вопрос, например:

Подумайте о следующем сценарии:

В вашей фирме есть новый вакантный пост инженера-программиста. Это означает, что человек, которого вы предпочтете заполнить эту должность, будет инженером-программистом (вы не можете выбрать парня-маркетолога для этого после). Поэтому создание этого сообщения похоже на объявление.

Теперь, когда вы определяете, что человек с этим сообщением может/не может сделать, какие у него есть власти, каковы его ограничения, тогда это называется определением.

Так что говоря

SoftwareEngineer se;

означает декларацию;

и

class SoftwareEngineer {

// define role and responsibilities
}

означает определение. Надеюсь, это поможет вам.

Ответ 6

Java Язык определяет только термин декларация не использует определение.

Декларация:

class A{}// class declaration

String str;// variable declaration

Ответ 7

Объявление: оператор, который устанавливает идентификатор и связывает с ним атрибуты,            без необходимости резервирования его хранения (для данных) или обеспечения реализации (для методов).

         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

Ответ 8

  1. Для объекта или примитива

Объявление: указание типа объекта или примитива

Определение: указание значения объекта или примитива

  1. Для метода

Объявление: указание подписи метода

Определение: указание реализации метода