2014-11-30 5 views
5

я проходил тест на itester.org и нашел вопрос, который я не понимаю:Почему переменная Integer по умолчанию имеет значение null?

public class Runner 
{ 
    public static Integer i; 

    public static void main(String[] args) 
    { 
     if (i == 42) { 
      System.out.printf("wow"); 
     } 
    } 
} 

Я прочитал до того, что целочисленной переменной присваивается по умолчанию 0. Почему здесь назначается null?

+3

Потому что это не примитив, а объект. Значение по умолчанию для объекта равно null. Когда вы делаете 'i == 42', он пытается удалить значение int в' i', но поскольку 'i' равно null, вы получаете NPE. –

+0

Gotta love Java - он делает * так * много смысла, что int и Integer - разные типы данных. – Craig

ответ

7

Любой ссылочный тип (то есть любая переменная, тип которой является объектом или подклассом объекта) имеет значение по умолчанию null. Это включает Integer.

Примитивный int, с другой стороны, имеет значение по умолчанию 0.

1

Все непримитивные нелокальные переменные присваиваются null, если они не назначены явно.

5

Потому что JLS 4.12.5. Initial Values of Variables:

Для всех ссылочных типов (§4.3), значение по умолчанию равно нулю.

И поскольку Integer является ссылка типа, он получает null:

ReferenceType: 
    ClassOrInterfaceType 
    TypeVariable 
    ArrayType 

Смотрите ссылку для других типов

5

Примитивный int типа присваивается 0 по умолчанию, но Ссылка Integer по умолчанию имеет значение null. Integer - это wrapper class - это объект, а не примитивный тип.

Возможно, вы захотите прочитать о autoboxing and unboxing в Java, процесс, посредством которого Java автоматически конвертирует между примитивными типами и классами-оболочками.

1

Целое число является классом-оболочкой, и в этом примере кода I является ссылочной переменной. (В java все не является объектом, поэтому мы используем классы-оболочки для того, чтобы объект и java выполняли бокс и unboxing). Все ссылочные переменные в java по умолчанию имеют значение null и весь примитивный тип имеют значение по умолчанию (например, int i -> 0)

Использование: - Частный статический int; то он имеет значение 0 по умолчанию.

3

В Java Integer - это тип объекта. В этом примере кода вам нужен примитивный тип, который является int. В Java любой тип типа объекта/ссылочный тип или любая переменная типа Sub типа объекта, которая не инициализируется автоматически, инициализируется нулем. Где в качестве примитивного типа значение по умолчанию.

Причина этого заключается в том, что Объекты предоставляют средства для полиморфизма, передаются по ссылке (или, точнее, имеют ссылки, переданные по значению) и выделяются из кучи. И наоборот, примитивы являются неизменяемыми типами, которые передаются по значению и часто выделяются из стека.

Смежные вопросы