Przekazywanie wartości do metod

0

Witam
czytałem ten artykuł o przekazywaniu wartości do metod w Javie:
https://www.javaworld.com/article/2077424/learn-java/does-java-pass-by-reference-or-pass-by-value.html

Czy dobrze rozumiem, że gdybym do tego dorzucił taki kod:

public static void tricky2(int k)
{
    k = k+4;
}

a w metodzie main:

int p = 23;
tricky2(p);
System.out.println(p);

to do metody jest przekazana wartość (kopia) referencji k z klasy(metoda main),
i po powrocie z metody wartość p nie jest zmieniona to dlatego, że JVM gdzieś z boku tworzy sobie nowy prymityw na który wskazuje kopia referencji?
coś jak w przypadku gdy:

public static void tricky3(Point point) {
    point = new Point(4,4); // tutaj kopia referecji point wskazywać bedzie od teraz na nowy obiekt
}

więc wracając do zmiennej p tak naprawde manipulujemy przy dodawaniu na innym prymitywie?

0

To co się dzieje w funkcji dzieje się na stosie, na chwilowych wartościach, które znikną, gdy funkcja skończy swój żywot. Dlatego nie działa badSwap z artykułu, i zmienne pnt1 i pnt2 nie zmieniają się miejscami.
Inaczej, Zamieniasz te wysłane referencje na stosie, więc "swap" nie działa. Natomiast funkcja tricky zmienia pnt1, gdyż nie ważne gdzie będąc, na stosie czy nie zmieniając referencję Zmieniasz obiekt. To tak jak manipulowanie wskaźnikiem w C, na przykład.

0

tak rozumiem przypadek z javaworld. a tego czego Nierozumiem jest przypadek z moja metodą tricky2.
czy tam jest niejawnie tworzony nowy prymityw w pamięci i na nim są wykonywane operacje dodawania, a tak że po powrocie do main nie widać efektu?

0

W przypadku zmiennych prostych (np. int) do metody zostaje przekazana kopia wartości zmiennej, a nie kopia referencji. W konsekwencji, zmiany w metodzie nie zmieniają pierwotnej zmiennej.
Na koniec mała zagadka, kod:

    void tricky(Integer a, int b, String c, Point d)    
    {
        a = 5;
        b = 5;
        c = "5";
        d.x = 5;
    }
        Integer x = 3;
        int y = 3;
        String z = "3";
        Point p = new Point(3, 3);
        System.out.println(x + " " + y + " " + z + " " + p);
        tricky(x, y, z, p);
        System.out.println(x + " " + y + " " + z +" "  + p);

Dlaczego jest takie wyjście:

3 3 3 java.awt.Point[x=3,y=3]
3 3 3 java.awt.Point[x=5,y=3]
0

@bogdans dzięki o to mi chodziło

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