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
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!
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
.
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.)
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).
Ponieważ wartość null jest odniesieniem. A typy pierwotne nie są typami odniesienia. Tylko obiekty są typami odniesienia.
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.
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.
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.
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
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"
- 1. NSCode: koder i dekoder dla typów pierwotnych
- 2. Standard kodowania dla parsowania typów pierwotnych w iOS
- 3. Spring @ResponseBody generuje nieprawidłowy JSON dla typów pierwotnych
- 4. Kolekcje Java. Dlaczego nie ma typów pierwotnych?
- 5. Zastępowanie domyślnej obsługi typów pierwotnych w Json.Net
- 6. Jak wyłączyć wszystkie niejawne konwersje typów pierwotnych?
- 7. Biblioteka typów typów danych dla C
- 8. Jakie są ograniczenia pierwotnych typów znaków w D?
- 9. Prawidłowy sposób korzystania z DropDownListFor z listą typów pierwotnych?
- 10. Dlaczego kolekcje Java nie mogą bezpośrednio zapisywać typów pierwotnych?
- 11. Czy Java definiuje rozmiar swoich typów pierwotnych w dowolnym miejscu?
- 12. Czy podczas generowania nowej podklasy NSManagedObject z pliku mojego modelu powinienem sprawdzić "Użyj właściwości skalarnych dla pierwotnych typów danych"?
- 13. columnDefinition = „text” dla wszystkich typów baz danych
- 14. Rozmiary typów danych dla ActionScript 3
- 15. Dlaczego funkcja java.util.function nie definiuje wyspecjalizowanych interfejsów funkcjonalnych dla wszystkich typów pierwotnych?
- 16. Programowanie typów danych
- 17. Migracja railsów przy użyciu typów danych specyficznych dla bazy danych
- 18. Dane podstawowe "użyj właściwości skalarnych dla prymitywnych typów danych" pole wyboru
- 19. Warunkowy punkt przerwania GDB dla typów arbitralnych
- 20. dlaczego pola bitowe dla tych samych typów danych mają mniejszy rozmiar w porównaniu do pól bitowych dla typów danych mieszanki
- 21. W jaki sposób .NET rozróżnia typy odniesienia względem typów pierwotnych i wartościowych:
- 22. rzutowania pierwotnych wskaźników typu
- 23. Jak ustawić domyślną kolejność sortowania na danych pierwotnych?
- 24. Serwer SQL: domyślna tabela konwersji typów danych
- 25. dplyr zmienić wiele typów danych
- 26. Dlaczego potrzebujemy "algebraicznych typów danych"?
- 27. jednolitej metody konwersji typów danych
- 28. Używanie typów danych w Haskell
- 29. Jak wysłać multimetr na typach pierwotnych?
- 30. Java: Synchronizacja na elementach pierwotnych?
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