2012-06-15 8 views
24

Podczas zadeklarowania jakichkolwiek pierwotnych danych typu, takich jak int lub double, zostają one zainicjowane jako 0 lub 0.0. Dlaczego nie możemy ustawić ich na null?Null dla pierwotnych typów danych

Odpowiedz

41

Typ pierwotny to tylko dane. Z drugiej strony, to, co nazywamy obiektami, jest tylko wskazówkami do miejsca przechowywania danych. Na przykład:

Integer object = new Integer(3); 
int number = 3; 

W tym przypadku object jest tylko wskaźnik do obiektu Integer, którego wartość bywa 3. Oznacza to, że w miejscu pamięci, gdzie przechowywana jest zmienna obiektu, wszystko co masz jest odwołaniem tam, gdzie naprawdę są dane. Natomiast pozycja pamięci, w której znajduje się number, zawiera bezpośrednio wartość 3.

Można więc ustawić wartość object na wartość null, ale oznacza to, że dane tego obiektu mają wartość null (czyli nie są przypisane). Nie możesz ustawić int na wartość null, ponieważ język będzie interpretował to jako wartość 0.

Nadzieję, że pomaga!

+0

Przypuszczam, że te najlepsze praktyki pozostają prawdziwe, nawet jeśli Java 8 wprowadziła opcjonalne prymitywy, takie jak OpcjonalneInt? Opcji OptionalInt.empty() można użyć zamiast wartości pustej. Ale rozumiem, że opcje powinny być zwrotnymi metodami, a nie typami dla samych właściwości. – tmn

5

Bo tak mówi standard językowy.

Jeśli chcesz mieć możliwość przekazania null, powinieneś użyć the wrapper types, np. Integer zamiast int.

3

Ponieważ jest to typ pierwotny, a nie obiekt. Możesz użyć odpowiedniego obiektu dla każdego typu, jeśli potrzebujesz możliwości użycia wartości pustych (tj. Double dla double, Long for long, Boolean dla boolean itd.)

8

Ponieważ pierwotne typy danych w Javie nie są Object s . Zawsze możesz użyć jednej z klas opakowania, aby uzyskać Object. Każdy z ośmiu prymitywnych typów danych posiada odpowiednie opakowanie:

  • bajt: java.lang.Byte
  • skrócie: java.lang.Short
  • int: java.lang.Integer
  • długa: java.lang.Long
  • pływak: java.lang.Float
  • podwójna: java.lang.Double
  • boolean: java.lang.Boolean
  • char java.lang.Character

Jeśli jesteś zainteresowany w całej konstrukcji, można rozpocząć here (Primitive Data Types).

13

Ponieważ wartość null jest odniesieniem. A typy pierwotne nie są typami odniesienia. Tylko obiekty są typami odniesienia.

1

Język programowania Java jest typowany statycznie, co oznacza, że ​​wszystkie zmienne muszą zostać najpierw zadeklarowane, zanim zostaną użyte. Obejmuje to podanie typu i nazwy zmiennej.

1

Wraz z powyższą odpowiedzią chciałbym również dodać ten punkt.

Dla typów pierwotnych mamy stały rozmiar pamięci, tj. Dla int mamy 4 bajty, a char mają 2 bajty. A wartość null jest używana tylko dla obiektów, ponieważ rozmiar pamięci nie jest poprawiony.

Więc domyślnie mamy,

int a=0; 

i nie

int a=null; 

samo z innych prymitywnych typów i stąd zerowy jest używany tylko dla obiektów, a nie dla prymitywnych typów.

2

Obiekty obejmują więcej narzutów niż prymitywy. Poniższy test pokazuje, że int wykonuje około 10 razy szybciej niż Integer.

int n; 
EtmPoint point1 = etmMonitor.createPoint("test:objects"); 
for (n = 0; n < 1000000; n++) { 
    Integer t = 0; 
    t = 10; 
    t = 11; 
} 

point1.collect(); 
EtmPoint point = etmMonitor.createPoint("test:primitives"); 
for (n = 0; n < 1000000; n++) { 
    int t = 0; 
    t = 10; 
    t = 11; 
} 
point.collect(); 

etmMonitor.render(new SimpleTextRenderer()); 

Dlatego właśnie .NET wdrożył prymitywy zerowalne, niestety java nie ma nullalnych prymitywów.

+0

I to jest właśnie powód pytania. .NET zaimplementował to wieki temu, a Java jest w tyle pod tym względem, niestety. – Shane

1

Przede wszystkim Różnica pierwotnego i odniesienia do obiektu to zmienna pierwotna przechowująca rzeczywiste wartości, podczas gdy obiektowa zmienna odniesienia przechowuje adres obiektu, do którego się odnosi, w tym przypadku w obiekcie odniesienia, jeśli nie ma adresu, przejdzie do "null".

Wartości domyślne typu danych pierwotnych zależą od typu danych pierwotnych: jak bajt = 0, krótki = 0, int = 0, długi = 0L, zmienny = 0,0f, podwójny = 0,0d, wartość logiczna = fałsz, znak = "\ u0000".

Kiedy deklarujemy zmienną dowolnego typu klasy, jest ona określana jako typ danych odniesienia.

EX:

T1 testu

Teście T2 (typ opakowania obiektów)

całkowitej I

długi l

domyślnych odniesienie do obiektu, JVM inicjuje zmienna referencyjna jako "null" i wola także zainicjować tablicę do "null"

Powiązane problemy