łatwe pytanie - przekazywanie przez referencję

0

Dlaczego zmienna "dupa" nie zmienia wartości zmiennej var? Nie kumam tego, bo przecież tworzę objekt, no i jeśli się nie mylę, to w javie jest przekazywanie objektów przez referencję.

        
class Dupa {
    public Dupa() {
        Boolean var = new Boolean(false);
        change(var);
    }

        public void change(Boolean var) {
            Boolean dupa;
            dupa = var;
            dupa = true;
        }
}
0

dupa = var;
To znaczy tyle, co wstawienie pod zmienną dupa wartości, która jest pod var. Nie zmieniamy wcale tego, na jaki fragment pamięci wskazuje dupa. To nie jest C++ i to nie są wskaźniki. Powinieneś wiedzieć zresztą, że nawet w C++ nie da się zmienić tego, na co wskazuje referencja.

1

Ponieważ token = w Javie oznacza przypisanie, a nie wywołanie funkcji (poza pewnymi transparentnymi dla programisty przypadkami). Dodatkowo w Javie mamy autoboxing. A więc:
dupa = true;
To w rzeczywistości:
dupa = new Boolean(true);

W Javie przekazujesz kopię referencji albo kopię prymitywu. Tak czy siak, oryginalnej referencji czy prymitywu nie zmienisz. Dlatego, aby np zwrócić kilka wartości z funkcji trzeba użyć obiektu opakowujacego. Przykładowy kod:

class Holder<A> {

    private A value;

    public Holder() {
    }

    public Holder(A value) {
        this.value = value;
    }

    public A getValue() {
        return value;
    }

    public void setValue(A value) {
        this.value = value;
    }
}

public class Main {
    
    void policzPierwiastki(double a, double b, double c, Holder<Double> x1, Holder<Double> x2) {
        double wyróżnik = b * b - 4 * a * c;
        x1.setValue((-b - Math.sqrt(wyróżnik)) / (2 * a));
        x2.setValue((-b + Math.sqrt(wyróżnik)) / (2 * a));
    }

    void run() {
        Holder<Double> x1 = new Holder<Double>();
        Holder<Double> x2 = new Holder<Double>();
        policzPierwiastki(1, -8, 15, x1, x2);
        System.out.println(x1.getValue() + " " + x2.getValue());
    }

    public static void main(String[] args) {
        new Main().run();
    }
}
0

Dzięki za kod, ale interesuje mnie tylko jedno, jak zrobić, żeby zmienić wartość var w funkcji, no więc, jak piszesz, się nie da.
Edit:
Tutaj znalazłem sposób: http://stackoverflow.com/questions/430479/how-do-i-use-an-equivalent-to-c-reference-parameters-in-java#431152

0

Przeciez Wvit podal dokladnie to samo rozwiazanie :o

Sklaniam sie ku twierdzeniu ze skoro czegos takiego potrzebujesz to cos jest nie tak z Twoim designem.

0

Pytałem tylko o jedną zmienną boolean, nie potrzebuję całej mapy, oczekiwałem konkretnej odpowiedzi.

0

Czlowieku a gdzie ty masz mape?
Na stack masz:
public static void addOne( _<Integer> ref ) {
a Vwit podal:
void policzPierwiastki(double a, double b, double c, Holder<Double> x1, Holder<Double> x2) {

Czyli klasa _<Integer> w przykladzie Vwita to Holder<Double>, przy czym jego przyklad ma wiecej sensu niz na stack, poniewaz gdy chodzi o jeden parameter to mozesz go po prostu zwrocic jako return - a u Vwita masz 2.

Ja nie widze zadnej mapy. Masz problemy z polskim, angielskim czy podstawami Javy? Myslisz ze _<Integer> to jakas szczegolna konstrukcja?

0

Nie, sorry. Też nie widzę mapy. Sorry, to wszystko przez to, że mnie trochę zdenerwował ten błąd, bo go próbowałem debugować.

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