Mamy dwie zmienne:
SomeObject obj1; SomeObject obj2;
Co będzie się znajdowało w zmiennej obj2, po wykonaniu poniższego kodu:
obj1 = new SomeObject(); obj2 = obj1;
Mamy dwie zmienne:
SomeObject obj1; SomeObject obj2;
Co będzie się znajdowało w zmiennej obj2, po wykonaniu poniższego kodu:
obj1 = new SomeObject(); obj2 = obj1;
Tu sytuacja jest dość klarowna:
SomeObject obj1; // deklaracja referencji SomeObject obj2; // deklaracja referencji obj1 = new SomeObject(); // utworzenie obiektu obj2 = obj1; // przepisanie referencji
Pierwsze dwa wiersze to deklaracje referencji. W zależności od miejsca ich deklaracji mogą być one zainicjowane (wartością null - w przypadku atrybutów klasy) lub nie (w razie zadeklarowania ich jako zmiennych wewnątrz metody). Te referencje mogą posłużyć do wskazania obiektów typu SomeObject, ale póki co, niczego nie wskazują.
W kolejnym wierszu za pomocą konstruktora tworzymy na stercie nowy obiekt (typu SomeObject). Operator new zwraca referencję do tego obiektu i przechowujemy ją w zmiennej obj1. Dzięki temu obiekt staje się dla nas dostępny i możemy z niego korzystać.
Ostatnia instrukcja to przepisanie zawartości zmiennej obj1 (a więc referencji) do zmiennej obj2. Ta instrukcja nie tworzy nowego obiektu! W rezultacie do jednego obiektu możemy odwołać się zarówno poprzez referencję obj1, jak i obj2.