2010-10-08 6 views
18

Я просто учился на своей Java в рамках подготовки к экзамену, и у меня возникла проблема с неинициализированными значениями int/Integer.Uninitialized int vs Integer

class A 
    { 
     int x; 
     Integer y; 
     static int z; 
     static Integer z2; 
     public A(){} 
    } 

Скажем, я инициализирую объект класса А. A a = новый A();

Я попытался это в компиляторе и получил результаты

a.x == 0; true 
a.x == null; Static Error: Bad type in comparison expression 
a.y == 0; java.lang.NullPointerException 
a.y == null; true 
a.z == 0; true 
a.z == null; Static Error: Bad type in comparison expression 
a.z2 == 0; NullPointerException 
a.z2 == null; true 

Кроме того, я попробовал некоторые более неинициализированным сравнения INT/Interger в качестве панели взаимодействий, чтобы увидеть, если я хотел бы получить разные результаты, если мой х, y не были переменными экземпляров экземпляра, поскольку они выше.

int x; 
Integer y; 
x == 0; true 
x == null; Static Error: Bad type in comparison expression 
y == 0; java.lang.NullPointerException 
y == null; true 

Однако мои претензии профессор в лекции, что значения должны быть следующими:

x == 0; Uninitialized 
x == null; Undefined 
y == 0; java.lang.NullPointerException 
y == null; Uninitialized 

Теперь я не хочу сомневаться тот, кто пишет экзамен, но х == 0 и y == Значение истины истинно верно? Объяснение о том, почему было бы очень полезно, спасибо.

+15

Если вам интересно, кто более правдоподобен, зная, что сделает компилятор: компилятор или ваш профессор ... ответ - это компилятор. –

ответ

17
  • a.x == 0 - Правда, потому что топор имеет значение по умолчанию, равным 0.
  • a.x == null - Как уже отмечалось, это ошибка времени компиляции. Это следует из §15.21.3: «Ошибка времени компиляции возникает, если невозможно преобразовать тип любого операнда в тип другого с помощью преобразования кастингов (§5.5)». Нулевой тип не конвертируется в число.
  • a.y == 0 - Это попытка удалить a.y,, который является нулевым, поэтому он генерирует исключение NullPointerException. В отличие от вышеизложенного (который имеет буквальный нуль), компилятор не пытается выяснить во время компиляции, что a.y будет null.
  • a.y == null - Опять же, правда, потому что a.y инициализируется в нуль
  • a.z == 0 - То же, что a.x (кроме статического)
  • a.z == null - То же, что a.x (кроме статического)
  • a.z2 == 0 - То же, что a.y (кроме статического)
  • a.z2 == null - То же, что a.y (кроме статического)

Проблема с областью взаимодействий заключается в том, что до реализации IDE требуется реализовать ее. Если x и y являются локальными (неинициализированными) переменными, все четыре из ваших последних сравнений не будут скомпилированы.

17

Java значения простых типов, таких как Int/длиной не может быть пустым, чтобы они инициализируются 0.

+2

Почему это было приостановлено? Это верно! –

+0

@Mark Peters: Спасибо. –

+1

Исправлены исходные переменные «экземпляр» ... локальные примитивные переменные не являются - они должны быть инициализированы. –

1

EDIT: Неинициализированные локальные переменные не могут быть использованы.

Кроме местных жителей:

инициализированы INT равен 0.

инициализированы Integer равен нулю.

Целое - это объект. Униализованные объекты равны нулю.

int - примитивный тип. Языковые функции определяют это неинициализированным значение 0.

+0

«Униализованные объекты равны нулю» - я так не думаю. –

+1

"Unitialized int равно 0. Единичное целое равен нулю." Не верно, только когда они являются переменными экземпляра, а не локальными переменными. –

+0

@Stas. Дайте мне один пример унифицированного объекта, который не является нулевым. – pablosaraiva

2
int x; 
Integer y; 
x == 0; true. because x is initialized to 0 by JVM 
x == null; Static Error: Bad type in comparison expression 
y == 0; java.lang.NullPointerException 
y == null; true, because y is uninitialized 
0

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

Thats причина, переменные внутри класса имеют следующие значения:

... а остальное идет на аналогично. Надеюсь, мой ответ полезен !!!

10

В Java переменные класса (статические), переменные экземпляра (те, что указаны в вашем примере) и компоненты массива заданы значениями по умолчанию. Локальные переменные, с другой стороны, должны быть явно заданы и не получать значения по умолчанию.

Для получения более подробной информации см. §4.12.5.

+1

Это из-за устаревшей JLS, возможно, захочет привести версию 3 (см. Ответ JeffW) –

+0

@Mark: Спасибо. Обновлено. – Nabb

1

Этот вопрос прослушивал меня раньше, так как описания и поведение кажутся немного непоследовательными. Если вы посмотрите на language specification в section 4.12.5, вы найдете раздел, который описывает это, и делает это с учетом того, что вы наблюдали за выполнением компилятором.

Причина, по которой я думаю, что это иногда путается, заключается в том, что другие публикации, которые я прочитал из Sun (например, «Core Java 2»), описывают поведение, указанное вашим проф.И в другом варианте я использую NetBeans, который позволяет использовать неинициализированные примитивы, но флаги - использование неинициализированных объектов; Однако я не уверен, что это компилятор или выбор IDE.

[EDIT: после просмотра одного из постов, я считаю, что эта путаница действительно проистекает из различного поведения для локальных переменных против полей.]

+0

Совет: укажите HTML-версию JLS, а не версию в формате pdf. –

+0

Хорошая точка. Исправлена. – JeffW

0

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

Я хотел бы привести пару строк на официальной странице учебников. https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

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

Локальные переменные немного отличаются; компилятор никогда не присваивает значение по умолчанию неинициализированной локальной переменной. Доступ к неинициализированной локальной переменной приведет к ошибке времени компиляции.

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

Значение по умолчанию для примитива по существу равно 0, где по умолчанию значение для объекта равно null. (когда неинициализируется и когда поле)

В вашем примере вы пытаетесь сравнить «от 0 до 0, от нуля до нуля и от нуля до нуля».

Факт: null! = 0.

  • 0 = числовое значение, не представляющее ничего.
  • null = буква для представления несуществующей ссылки. (Вы можете увидеть What is null in Java? для получения более подробной информации о нулевой)

FYI: Я считаю, что этот вопрос был дан ответ великолепно Мэтью Flaschen уже, я просто хотел, чтобы добавить дополнительную информацию для тех, кто заинтересован.