Przeczytałem kilka artykułów, odpowiedzi ze Stacka, obejrzałem kilka filmików na YT i nadal nie mam pewności czy dobrze rozumiem jak działa pamięć w Javie i czy Java jest pass-by-value cyz pass-by-reference, tak więc prosiłbym o potwierdzenie ;)
- Mamy dwa typy danych - primitives i reference types.
- Te pierwsze, jeżeli stworzone lokalnie, są przechowywane na stosie. Poniższy kod stworzy dwa osobne elementy na stosie.
int a = 3;
int b = a;
Jeżeli napiszę teraz b = 5
, zmienie tylko wartość zmiennej b
, zmienna a
pozostanie równa 3.
- Te drugie, na stosie przechowywują wskaźnik do faktycznej wartości obiektu na stercie. Poniższy kod stworzy na stosie dwa wskaźniki do tej samej wartości na stercie:
User john = new User("john");
User jack = john;
Oznacza to, że jack.name = "Jack"
spowoduje zmianę w zmiennej john
i jack
-
Przekazanie czegokolwiek do funkcji, powoduje stworzenie kopii przekazanej wartości, tak więc wszystkie zmiany jakie zrobie wewnątrz funkcji, nie zmodyfikują oryginalnego argumentu. Jednakże, analogiczne jak w powyższych przykładach, przekazanie primitywnego typu, powoduje stworzenie jego kopii na stosie, więc faktycznie zmiana czegoś wewnątrz funkcji wpłynie tylko na kopie. Z drugiej strony, przekazanie obiektu, spowoduje stworzenie na stosie kopii wskaźnika, który jednak wskazuje na tę samą referencę na stercie. Dlatego też, zmiana właściwości kopii tego obiektu, zostanie również zaaplikowana do oryginalnego obiektu.
-
Jako, że Java jest pass-by-value, oznacza to że value to adres konkretnego bytu, a reference to jego faktyczna wartość?
-
Co faktycznie jest przechowywane na stosie w przypadku typów primitywnych?