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.
jeśli w javie wszystko jest obiektem
Ale wcale tak nie jest
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.
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.
No właśnie prymitywy nie są obiektami, w sensie OOP
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