Box buttonBox = new Box(BoxLayout.Y_AXIS);  
Name1 name2 = new Name1();  

Есть два Name1s

checkboxList = new ArrayList<JCheckBox>();  
name2 = new Name1();  

Есть только одно Имя1

Работает, но почему?

0
Delirium tremens 16 Июн 2009 в 19:11

4 ответа

Лучший ответ

В первый раз Name1 name2 объявляет переменную типа Name1 с именем name2, затем она немедленно присваивается new Name1(). Во второй раз переменная уже существует; вы просто переназначаете его.

Некоторым нравится использовать:

Name1 name2;
name2 = new Name1();

Вместо эквивалента:

Name1 name2 = new Name1();

Но мне гораздо легче читать второй.

Я предлагаю вам ознакомиться с руководствами по Java, особенно Начало работы и Изучение языка Java. Они охватывают всевозможные вопросы для начинающих, подобные этому.

4
Michael Myers 16 Июн 2009 в 15:13

В дополнение к уже описанным вопросам синтаксиса и формальности, рекомендуется не использовать повторно переменные таким образом. Причина - в государственном взрыве; если переменная может потенциально находиться в другом состоянии в любой момент вашей программы, тогда вам придется иметь дело с большим количеством возможностей. Поэтому обычно лучше объявлять и использовать отдельные переменные, помечая их как «окончательные», как опубликовал Майкл Боргвардт.

0
Dan Gravell 16 Июн 2009 в 15:48

Как сказал Ммайерс, вы уже объявили переменную class Name1 с именем name2.

Когда вы пишете X y = new X(), происходит три вещи:

  1. Слева от знака равенства вы объявляете переменную y как имеющую тип X. Она еще не создана и не существует в памяти, вы просто говорите, что она будет существовать.

  2. Справа вы создаете экземпляр X, используя ключевое слово new . Теперь он существует в куче.

  3. Сам знак равенства присваивает экземпляр, созданный на шаге 2, переменной, созданной на шаге 1.

Во второй строке вы просто пропустили шаг 1. и создали новый экземпляр, который вы присвоили уже используемой переменной.

0
mikek 16 Июн 2009 в 15:22
Name1 name2 = new Name1();

В этой строке вы делаете две вещи:

  1. объявить переменную с именем name2 типа Name1
  2. создать объект, вызвав конструктор без аргументов класса Name1 и назначив ссылку на вновь созданный объект переменной name2

Вы также можете разделить шаги:

Name1 name2;
name2 = new Name1();

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

final Name1 name2 = new Name1();
name2 = new Name1();

Вы получите ошибку компилятора, потому что вы пытаетесь использовать ту же переменную во второй раз. Это может быть полезно, поскольку предотвращает ошибки программиста, возникающие при повторном использовании переменных.

1
Michael Borgwardt 16 Июн 2009 в 15:20