В чем разница между объявлением и определением в Java?


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

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

8 63

8 ответов:

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

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

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

В Java, есть небольшая разница между ними, и формально говоря, объявление включает в себя не только идентификатор, но и его определение. Вот как я лично интерпретирую термины в деталях:

  • классы: Java на самом деле не разделяет объявления и определения, как это делает C/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 позволяет объявлять членов в любом порядке, нет необходимости в "прямых объявлениях". Это тот контекст, в котором необходимо различать эти два понятия.
  • в Java пространство стека, необходимое для переменной, является константой времени компиляции, поэтому вычисления смещения стека происходят во время компиляции. (Помните, что в Java, в массив-это ссылка на объект в куче ... и только ссылка удерживается в кадре стека.)
  • способ, которым Java обрабатывает " определение без инициализации "поля или переменной, не требует одной точки" объявления". Если требуется инициализация переменной, это может произойти в нескольких точках исходного кода.

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

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

С Солнце глоссарий, определение:

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

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

то, как я читаю Солнечный глоссарий, было бы похоже это:

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. Дефиниция - это когда мы присваиваем им значения или объект.

         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
  1. для объекта или примитива

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

определение: задание стоимостью объекта или примитива

  1. метод

декларация: задание подпись метод

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