Spróbujmy od tej strony:
JVM (wirtualny maszyna Javy) ma dwa wydzielone obszary pamięci - heap i stack.
Zmienna:
Typy prymitywne, czyli te pisane z małej (boolean, char, int, long, float, double) są trzymane w stack'u.
przykładowo:
Kopiuj
public int foo(){
int i = 1;
return -1;
}
Obiekty - w zależności od widzimisię kompilatora, trafiają do heap'a lub stack'u. Zazwyczaj do tego pierwszego, do drugiego mogą trafić tylko w sytuacjach szczególnych (jak maszyna uzna, że tak będzie szybciej i prościej). I tak:
Kopiuj
public MyPojo foo(){
MyPojo pojo = new MyPojo();
return null;
}
Obiekt pojo zostanie usunięty z pamięci dopiero w momencie, w którym GC przeskanuje heap w celu usunięcia zbędnych danych.
Referencja to taki szczególny typ obiektu, którego zadaniem jest przechowywać zależność pomiędzy zmienną, a obszarem w pamięci, pod którą kryje się obiekt. Czyli:
Kopiuj
MyPojo pojo;
pojo = new MyPojo();
Wrappery to szczególne typy obiektów, które "opakowują" typy prymitywne. Typy są pisane wielką literą, np. Integer, String, Double itp. Tak jak już tutaj było napisane, można je tworzyć poprzez operator "new":
Kopiuj
Integer myInt = new Integer(1);
Jak wiemy można obiekty typu Integer tworzyć bezpośrednio przez operator przypisania. Jest to pewna metoda mająca na celu zwiększenie wydajności i de facto jest to po prostu łatwiejszy sposób na wywołanie Integer.valueOf, tj.
Kopiuj
Integer int1 = 1;
Integer int2 = Integer.valueOf(1);
Integer int3 = new Integer(1);
Integer int4 = 1;
System.out.println(int1 == int2);
System.out.println(int1 == int3);
System.out.println(int1 == int4);
Ot, takie usprawnienie dla developerów.
final
, tego się nie da już zmienić :P