łatwe pytanie - przekazywanie przez referencję

łatwe pytanie - przekazywanie przez referencję
M3
  • Rejestracja:około 14 lat
  • Ostatnio:ponad 13 lat
  • Postów:42
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ę.

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

        public void change(Boolean var) {
            Boolean dupa;
            dupa = var;
            dupa = true;
        }
}
edytowany 2x, ostatnio: marcos3131
RE
Moderator
  • Rejestracja:około 18 lat
  • Ostatnio:około rok
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.

Wibowit
  • Rejestracja:około 20 lat
  • Ostatnio:25 minut
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:

Kopiuj
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();
    }
}

"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
M3
  • Rejestracja:około 14 lat
  • Ostatnio:ponad 13 lat
  • Postów:42
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

edytowany 3x, ostatnio: marcos3131
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.

M3
  • Rejestracja:około 14 lat
  • Ostatnio:ponad 13 lat
  • Postów:42
0

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

edytowany 3x, ostatnio: marcos3131
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?

M3
  • Rejestracja:około 14 lat
  • Ostatnio:ponad 13 lat
  • Postów:42
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ć.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.