Unboxing i Autoboxing pytanie

0

Mam taka zagwozdkę, jeśli w javie wszystko jest obiektem, czym sa typy prymitywne? czy one są także obiektami? Wiem że typ prymitywny można opakować obiektem, jak i na odwrót. Ale czy w klasie Integer jest odpowiednia implementacja pozwalajaca uzywac typu prymitywnego? int ? czy jak to wygląda pod maska.

2

jeśli w javie wszystko jest obiektem

Ale wcale tak nie jest

0

Jeżeli uznać, że coś na kształt:

String mystring;

Czyli referencja jest wartością liczbową wskazującą na jakiś tam obszar pamięci, to ta wartość zachowuje się jak dowolny inny typ prymitywny, z tą różnicą, że jedyna operacja do której masz na nim dostęp to ustawienie wartości. To bliższe prawdy będzie stwierdzenie, że w Javie absolutnie wszystko jest typem prymitywnym.

Przykładowo mamy klasę ArrayList, niby obiekt, ale w środku trzyma wszystkie dane w zwykłej tablicy i int.

0

co to znaczy, że wszystko jest obiektem? zwykle rozumie się przez to, że cokolwiek instanceof Object == true (to == true jest tutaj tylko dla jasności przekazu). możesz sobie wypróbować w obecnej wersji javy np. 5 instanceof Object - nie skompiluje się nawet. działać będzie dopiero jak wejdzie http://openjdk.java.net/jeps/402 , ale samo w sobie niewiele to wnosi. dla przykładu, genericsy na prymitywach to osobny ficzer: http://openjdk.java.net/jeps/218 . boxing i unboxing są głównie dlatego, że nie ma genericsów na prymitywach.

0

No właśnie prymitywy nie są obiektami, w sensie OOP

0

Typy prymitywne nie są obiektami, natomiast można go łatwo opakować w typ obiektowy. Np. dla intów (czyli Integer - typ obiektowy, int - typ prymitywny):

Integer boxedObject = new Integer(2); // w ten sposób tworzysz obiekt - czyli opakowujesz int=2 w obiekt Integer
Integer boxedObject2 = Integer.valueOf(2); // ręczny boxing wartości (tutaj obiekt niekoniecznie musi powstać)
Integer autoboxedObject = 2; // automatyczny boxing, de facto jest równoważne Integer.valueOf(2)
Integer nullObject = null; // do Integera możesz dorzucić nulla

int value = 2; // wartość prymitywna, nie tworzysz obiektu tylko do zmiennej przypisujesz wartość
int directlyUnboxedValue = boxedObject.intValue(); // ręczny unboxing 
int autoUnboxedValue = boxedObject; // to jest automatyczny unboxing wartości, czyli nie musisz wołać intValue() 
int willFail = nullObject; // podczas autounboxingu intValue() rzuci NullPointerException

1 użytkowników online, w tym zalogowanych: 0, gości: 1