Na przykład, dlaczego możesz:
int n = 9;
Ale nie:
Integer n = 9;
I możesz zrobić:
Integer.parseInt("1");
Ale nie:
int.parseInt("1");
Integer n = 9;
powodu autoboxowania (chyba że używasz bardzo starej wersji java)
Na przykład, dlaczego możesz:
int n = 9;
Ale nie:
Integer n = 9;
I możesz zrobić:
Integer.parseInt("1");
Ale nie:
int.parseInt("1");
Integer n = 9;
powodu autoboxowania (chyba że używasz bardzo starej wersji java)
Odpowiedzi:
int
jest prymitywnym typem. Zmienne typu int
przechowują rzeczywistą wartość binarną liczby całkowitej, którą chcesz reprezentować. int.parseInt("1")
nie ma sensu, bo int
to nie klasa, a zatem nie ma żadnych metod.
Integer
jest klasą, niczym nie różniącą się od innych w języku Java. Zmienne odwołań do Integer
magazynu typu do obiektów, tak jak w przypadku każdego innego typu odwołania (obiektu). jest wywołaniem metody statycznej z klasy (zauważ, że ta metoda faktycznie zwraca an, a nie an ).Integer
Integer.parseInt("1")
parseInt
Integer
int
Integer
Mówiąc ściślej, Integer
jest to klasa z jednym polem typu int
. Ta klasa jest używana tam, gdzie trzeba int
traktować jak każdy inny obiekt, na przykład w typach ogólnych lub sytuacjach, w których potrzebujesz zerowalności.
Zauważ, że każdy typ pierwotny w Javie ma równoważną klasę opakowania :
byte
ma Byte
short
ma Short
int
ma Integer
long
ma Long
boolean
ma Boolean
char
ma Character
float
ma Float
double
ma Double
Klasy opakowań dziedziczą po klasie Object, a prymityw nie. Można go zatem używać w kolekcjach z odniesieniem do obiektu lub z ogólnikami.
Od wersji java 5 mamy autoboxing, a konwersja między klasą pierwotną i klasą opakowania jest wykonywana automatycznie. Uważaj jednak, ponieważ może to wprowadzić subtelne błędy i problemy z wydajnością; wyraźne mówienie o konwersjach nigdy nie boli.
C#
wszystkich typach danych mają „aliasy” i int.Parse()
mają sens (nawet jeśli tak naprawdę nie ma)
C#
jest tutaj całkowicie nieistotne.
Liczba całkowita jest klasą, a liczba int jest typem pierwotnym.
Czytaj dalej pod tymi linkami:
Liczba całkowita jest właściwie tylko opakowaniem dla pierwotnego typu int. Pozwala ci korzystać ze wszystkich funkcji klasy Integer, aby ułatwić ci życie.
Jeśli jesteś nowy w Javie, powinieneś nauczyć się doceniać dokumentację Java. Na przykład wszystko, co chcesz wiedzieć o klasie całkowitej, jest szczegółowo udokumentowane.
Wynika to wprost z dokumentacji dla klasy Integer:
Klasa Integer otacza wartość typu pierwotnego int w obiekcie. Obiekt typu Integer zawiera pojedyncze pole, którego typem jest int.
Integer
klasa, może być przechowywany w kontenerach (w przeciwieństwie do typów pierwotnych).
Zmienna int zawiera 32-bitową liczbę całkowitą ze znakiem. Liczba całkowita (z wielką literą I) zawiera odwołanie do obiektu typu Integer (klasy) lub do wartości null.
Java automatycznie rzuca między nimi; od Integer do int za każdym razem, gdy obiekt Integer występuje jako argument dla operatora int lub jest przypisany do zmiennej int lub wartość int jest przypisana do zmiennej Integer. Ten casting nazywa się boxing / unboxing.
Jeśli zmienna Integer odwołująca się do wartości null zostanie rozpakowana, jawnie lub niejawnie, generowany jest wyjątek NullPointerException.
(W powyższym tekście termin „zmienna” oznacza lokalną zmienną, pole lub parametr)
Integer
odnosi się do typu opakowania w Javie, podczas gdy int
jest typem pierwotnym. Wszystko oprócz prymitywnych typów danych w Javie jest implementowane tak, jak obiekty, które sugerują, że Java jest wysoce wykwalifikowanym, czysto obiektowym językiem programowania. Jeśli potrzebujesz, wszystkie typy operacji podstawowych są również dostępne jako typy opakowań w Javie. Typy pierwotne mogą przynieść pewne korzyści w zakresie wydajności, dlatego typy opakowań powinny być używane tylko wtedy, gdy jest to konieczne.
W twoim przykładzie jak poniżej.
Integer n = 9;
stała 9
jest automatycznie umieszczana w ramkach ( auto-boxing
i unboxing
pojawia się automatycznie od java 5
początku) do, Integer
a zatem można użyć instrukcji w ten sposób, a także Integer n = new Integer(9)
. W rzeczywistości osiąga się to poprzez oświadczenieInteger.valueOf(9).intValue();
int jest typem pierwotnym, a nie obiektem. Oznacza to, że nie ma z nim żadnych metod. Liczba całkowita jest obiektem z metodami (takimi jak parseInt).
W nowszej wersji Java dostępna jest funkcja automatycznego boxowania (i rozpakowywania). Oznacza to, że kompilator wstawi Integer.valueOf (int) lub integer.intValue () w razie potrzeby. Oznacza to, że tak naprawdę można pisać
Integer n = 9;
co jest interpretowane jako
Integer n = Integer.valueOf(9);
Liczba całkowita jest klasą opakowania / Obiektem, a int jest typem pierwotnym. Ta różnica odgrywa ogromną rolę, gdy chcesz przechowywać wartości int w kolekcji, ponieważ akceptują one tylko obiekty jako wartości (do jdk1.4). JDK5 i następne z powodu autoboxowania to zupełnie inna historia.
Integer.valueOf(i)
lub Integer.intValue()
dla ciebie. Collection<int>
nadal nie będzie działać. Więc to nie jest zupełnie inna historia - to ta sama historia, z odrobiną skrótu.
W Javie int jest prymitywnym typem danych, podczas gdy Integer jest klasą Helper, służy do konwersji jednego typu danych na inny.
Na przykład:
double doubleValue = 156.5d;
Double doubleObject = new Double(doubleValue);
Byte myByteValue = doubleObject.byteValue ();
String myStringValue = doubleObject.toString();
Prymitywne typy danych przechowują najszybszą dostępną pamięć, w której klasa Helper jest złożona, i przechowują w pamięci sterty.
referencja ze szkolenia Java Essential „David Gassner”.
int
jest pierwotnym typem, który reprezentuje liczbę całkowitą. mając na uwadze, Integer
że obiekt jest zawijany int
. Integer
Obiekt daje większą funkcjonalność, takich jak konwersja do hex, sznurka, itd.
Możesz także używać koncepcji OOP z Integer
. Na przykład możesz użyć liczby całkowitej do generics (tj .).Collection
<Integer>
To jest wzięte z Java: The Complete Reference, wydanie dziewiąte
Java używa typów pierwotnych (zwanych także typami prostymi), takich jak int lub double , aby przechowywać podstawowe typy danych obsługiwane przez język. Typy pierwotne , a nie obiekty, są używane dla tych ilości ze względu na wydajność . Użycie obiektów dla tych wartości spowodowałoby niedopuszczalne obciążenie nawet w najprostszych obliczeniach. Zatem typy pierwotne nie są częścią hierarchii obiektów i nie dziedziczą Object .
Pomimo korzyści związanych z wydajnością oferowanych przez typy pierwotne, zdarza się, że potrzebujesz reprezentacji obiektu. Na przykład nie można przekazać typu pierwotnego przez odwołanie do metody . Ponadto wiele standardowych struktur danych implementowanych przez Javę działa na obiektach, co oznacza, że nie można używać tych (specyficznych dla obiektu) struktur danych do przechowywania typów pierwotnych . Aby poradzić sobie z tymi (i innymi) sytuacjami, Java udostępnia opakowania typów, które są klasami, które zawierają typ pierwotny w obiekcie.
Klasy opakowań odnoszą się bezpośrednio do funkcji autokoksowania Javy . Opakowania typu to Double, Float, Long, Integer, Short, Byte, Character i Boolean . Klasy te oferują szeroki wachlarz metod, które pozwalają w pełni zintegrować prymitywne typy z hierarchią obiektów Java.
Aby zoptymalizować środowisko wykonawcze kodu Java, dodano int
pierwotne typyfloat
, w tym bool
itp., Ale zawierają one klasy otoki, dzięki czemu w razie potrzeby można je konwertować i używać jako standardowego obiektu Java wraz z wieloma narzędziami, które są ich członkami funkcje (takie jak Integer.parseInt("1")
).
int
jest prymitywnym typem danych, podczas gdy Integer
jest typem referencyjnym lub opakowaniowym (klasa) w Javie.
po java 1.5
czym wprowadzimy koncepcję autoboxowania i rozpakowywania , możesz zainicjować oba int
lub Integer
tak.
int a= 9
Integer a = 9 // both valid After Java 1.5.
dlaczego
Integer.parseInt("1");
ale nieint.parseInt("1");
??
Integer
to klasa zdefiniowana w jdk
bibliotece i parseInt()
metoda statyczna należy do Integer
klasy
Tak, Integer.parseInt("1");
jest to możliwe w Javie. ale int
jest to typ pierwotny (załóżmy jak słowo kluczowe) w java. Tak więc, nie można wywołać parseInt()
z int
.