Java: определение условий инициализации, объявления и назначения - PullRequest
35 голосов
/ 10 апреля 2010

Я считаю, что определения круговые, субъекты определяются по их глаголам, но глаголы не определены!Итак, как вы их определяете?

Циркулярные определения

инициализация: для инициализации переменной.Это можно сделать во время объявления.

назначение: для присвоения значения переменной.Это можно сделать где угодно, только один раз с конечным идентификатором.

объявление: для объявления значения переменной.

[обновить, пытаясь понятьтема с лямбда-кальком]

D(x type) = (λx.x is declared with type) 
A(y D(x type)) = (λy.y is assigned to D(x type))

%Then after some beta reductions we get initialization.
D(x type) me human                  // "me" declared with type "human"
A(y (D(x type) me human)) asking    // "asking" assigned to the last declaration

%if the last two statemets are valid, an initialization exists. Right?

Ответы [ 7 ]

63 голосов
/ 10 апреля 2010

присваивание : отбрасывать старое значение переменной и заменять его новым

инициализация : это особый вид назначения: первый. До инициализации объекты имеют значение null, а типы примитивов имеют значения по умолчанию, например 0 или false Может быть сделано вместе с декларацией.

объявление : объявление указывает тип переменной вместе с ее именем. Переменная может быть объявлена ​​только один раз. Он используется компилятором, чтобы помочь программистам избежать ошибок, таких как присвоение строковых значений целочисленным переменным. Перед чтением или назначением переменной эта переменная должна быть объявлена.

61 голосов
/ 10 апреля 2010
String declaration;
String initialization = "initialization";
declaration = "initialization"; //late initialization - will initialize the variable.
    // Without this, for example, in java, you will get a compile-time error if you try 
    // to use this variable.

declaration = "assignment"; // Normal assignment. 
    // Can be done any number of times for a non-final variable
9 голосов
/ 10 апреля 2010

Объявление не должно объявлять «значение» переменной; это объявить тип переменной.

Назначение - это просто сохранение значения в переменной.

Инициализация - это присвоение значения переменной во время объявления .

Эти определения также применяются к полям.

int i;  // simple declaration
i = 42  // simple assignment

int[] arr = { 1, 2, 3 };
// declaration with initialization, allows special shorthand syntax for arrays

arr = { 4, 5, 6 }; // doesn't compile, special initializer syntax invalid here
arr = new int[] { 4, 5, 6 }; // simple assignment, compiles fine

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

int i; // local variable declaration
if (something) i = 42;
System.out.println(i);
  // compile time error: The local variable i may not have been initialized

Это, однако, компилируется:

int i; // the following also compiles if i were declared final
if (something) i = 42;
else i = 666;
System.out.println(i);

Здесь i можно «инициализировать» из двух возможных мест с помощью простых назначений. Из-за этого, если i был массивом, вы не можете использовать специальный синтаксис сокращений инициализатора массива с этой конструкцией.

Таким образом, в основном, «инициализация» имеет два возможных определения в зависимости от контекста:

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

Также есть класс JVM-контекста и инициализация экземпляра, инициализация объекта OOP-контекста и т. Д.

3 голосов
/ 17 января 2017

Вот краткое объяснение с некоторыми примерами.

Декларация: Объявление - это когда вы объявляете переменную с именем, и переменная может быть объявлена ​​только один раз.

Пример: int x;, String myName;, Boolean myCondition;

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

Пример: int x = 7;, String myName = "Emi";, Boolean myCondition = false;

Назначение: Назначение - это когда мы уже объявили или инициализировали переменную, и мы меняем значение. Вы можете изменять значение переменной столько раз, сколько вам нужно или сколько вам нужно.

Пример:

int x = 7; x = 12; ....... Мы только что изменили значение.

String myName = "Emi"; myName = "John" ....... Мы только что изменили значение.

Boolean myCondition = false; myCondition = true; ....... Мы только что изменили значение.

Примечание: в памяти будет сохранено последнее введенное нами значение.

3 голосов
/ 10 апреля 2010

объявление : всякий раз, когда вы определяете новую переменную с ее типом

присваивание : всякий раз, когда вы изменяете значение переменной, присваивая ей новое значение

инициализация : присваивание, которое выполняется вместе с объявлением, или в любом случае первое присваивание, которое выполняется с переменной, обычно это вызов конструктора для объекта или простое присваивание для переменной

1 голос
/ 21 июля 2016

Шаг 1: Декларация : int a;

Шаг 2: Инициализация : a = 5;

Шаг 3: Назначение : a = b; (например: int b = 10; теперь a становится 10)

0 голосов
/ 31 августа 2015

Я из C / C ++, но идеи должны быть такими же.

Объявление - Когда переменная объявляется, она говорит компилятору выделить часть памяти и связать с ней имя (и тип переменной). В C / C ++ это может выглядеть так:

int x;

Компилятор видит это и оставляет в стороне местоположение адреса для x и знает, какие методы он должен использовать для выполнения операций над x (разные типы переменных будут использовать разные операции доступа). Таким образом, когда компилятор запускается в строку

x = 3 + 5;

Он знает, что нужно поместить целочисленное значение 8 (а не значение с плавающей запятой 8) в ячейку памяти, также известную как 'x'.

Назначение - это когда вы помещаете значение в ранее объявленную переменную. Назначение связано со знаком равенства. В предыдущем примере переменной 'x' было присвоено значение 8.

Инициализация - это когда для переменной задано значение. Нет гарантии, что для каждой переменной будет задано какое-то значение по умолчанию во время объявления переменной (если вы явно не сделаете это). Можно утверждать, что инициализация - это первое присвоение переменной, но это не совсем так, как я объясню позже. Типичная инициализация представляет собой смесь объявления переменной с присваиванием следующим образом:

int x = 6;

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

const int c = 15;

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

...