2014-11-30 66 views
5

szedłem testu na itester.org i znalazł pytanie, które ja nie rozumiem:Dlaczego domyślnie zmienna typu Integer ma wartość NULL?

public class Runner 
{ 
    public static Integer i; 

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

czytałem wcześniej, że zmienna liczba całkowita jest przypisany domyślnie 0. Dlaczego jest tutaj przypisywany null?

+3

Ponieważ nie jest to obiekt pierwotny, ale obiekt. Domyślna wartość obiektu jest zerowa. Kiedy robisz 'i == 42', próbuje rozpakować wartość int w' i', ale ponieważ 'i' ma wartość null, dostajesz NPE. –

+0

Uwielbiam Javę - sprawia, że ​​* więc * wiele sensu, że int i Integer to różne typy danych. – Craig

Odpowiedz

7

Dowolny typ odniesienia (tj. Każda zmienna, której typem jest Obiekt lub podklasa obiektu) ma domyślną wartość null. Obejmuje to Integer.

Prymitywna int, z drugiej strony, ma domyślną wartość 0.

1

Wszystkie nieparzyste zmienne nielokalne są przypisywane do null, jeśli nie są jawnie przypisane.

5

ponieważ JLS 4.12.5. Initial Values of Variables:

Dla wszystkich typów referencyjnych (§4.3), wartością domyślną jest null.

A ponieważ Integer jest odniesienia typ, robi null:

ReferenceType: 
    ClassOrInterfaceType 
    TypeVariable 
    ArrayType 

Zobacz link do innych typów

5

Prymitywna int typ jest przypisane domyślnie 0, ale odwołanie Integer ma domyślnie wartość null. Integer to wrapper class - jest to obiekt, a nie typ pierwotny.

Możesz przeczytać o autoboxing and unboxing w Javie, proces, w którym Java automatycznie konwertuje między typami pierwotnymi i klasami otoki.

1

Integer jest klasą opakowania, w tym przykładzie kodu I jest zmienną referencyjną. (W java wszystko nie jest obiektem, więc używamy klas wrappera, aby obiekt i java wykonały boksowanie i rozpakowywanie) Wszystkie zmienne referencyjne w java domyślnie wartość pusta i wszystkie typy pierwotne mają domyślną wartość (np. Int i -> 0)

Zastosowanie: - Prywatne statyczne int; wtedy ma wartość domyślną 0.

3

W języku Java Integer to typ obiektu. W tym przykładowym kodzie potrzebny jest typ pierwotny, który jest int. W Javie: dowolny typ obiektu/typ odniesienia lub dowolna zmienna typu obiektu typu Sub, która nie jest inicjowana automatycznie inicjalizowana przez wartość null. Gdzie jako typ pierwotny ma wartość domyślną.

Powodem tego jest, Obiekty zapewniają udogodnienia dla polimorfizmu, są przekazywane przez odniesienie (lub dokładniej mają odniesienia przekazane przez wartość) i są przydzielane ze sterty. Odwrotnie, prymitywy są niezmiennymi typami, które są przekazywane przez wartość i są często przydzielane ze stosu.