Неинициализированный int против Integer - PullRequest
20 голосов
/ 08 октября 2010

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

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

Допустим, я инициализирую объект класса A. A a = new 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 на панели взаимодействий, чтобы посмотреть, получу ли я другие результаты, если бы мои x, 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

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

Ответы [ 9 ]

18 голосов
/ 08 октября 2010

Значения Java простых типов, таких как int / long, не могут быть нулевыми, поэтому они инициализируются 0. 0. 1001 *

18 голосов
/ 08 октября 2010
  • a.x == 0 - Истина, потому что у ax значение по умолчанию равно 0.
  • a.x == null - Как уже отмечалось, это ошибка времени компиляции.Это следует из §15.21.3 : «Ошибка времени компиляции возникает, если невозможно преобразовать тип одного операнда в тип другого путем преобразования приведения (§5.5)».Нулевой тип не может быть преобразован в число.
  • a.y == 0 - он пытается распаковать a.y,, который является нулевым, поэтому он генерирует исключение NullPointerExceptionВ отличие от вышеприведенного (который имеет буквальный ноль), компилятор не пытается выяснить во время компиляции, что a.y будет нулевым.
  • 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 являются локальными (неинициализированными) переменными, все четыре ваших последних сравнения не будут скомпилированы.

10 голосов
/ 08 октября 2010

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

Подробнее см. §4.12.5 .

2 голосов
/ 14 марта 2018
class A
{
   int x;
   Integer y;
   static int z;
   static Integer z2;
   public A(){}   
}

ваш компилятор говорит

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

Оба верны, кроме того, что ваш учитель использует разные терминыПричина в том, что по умолчанию JAVA инициализирует неинициализированные значения для 0 или ноль для объектов.Ваш учитель называет их неинициализированными.Он прав, потому что эти значения еще не были инициализированы (но они все еще имеют значения по умолчанию).Ваш учитель хочет научить вас всегда инициализировать переменные, потому что это хорошая практика.

2 голосов
/ 08 октября 2010
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
1 голос
/ 08 октября 2010

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

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

[РЕД.

1 голос
/ 08 октября 2010

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

Кроме локальных:

Unitialized int равно 0.

Unitialized Integer равно нулю.

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

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

0 голосов
/ 27 января 2016

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

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

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

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

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

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

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

Факт: ноль! = 0.

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

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

0 голосов
/ 08 октября 2010

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

По этой причине переменные внутри класса имеют следующие значения:

int x = 0 //default value (value type)
Integer y = null //default values of any object; here Integer is reference type

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...