zwracanie wartości przez funkcję w parametrze(referencja)

0

W C# przyzwyczaiłem się do słówka ref, które załatwiało sprawę:

void funkcja(ref int zmienna){zmienna=0;}

i po wykonaniu funkcji zwrócona zmienna zawsze wyniesie 0.

Potrzebuję podobnej metody w Javie.
napisałem, lecz nie działa:

import java.io.*;
class Test	{
	public static void main(String args[])
	{	Console c = System.console();
		Integer i = new Integer(Integer.parseInt(c.readLine("Podaj dowolna liczba calkowia rozna od zera: ")));
		funkcja(i);
		System.out.println(i);// zawsze oczekiwane zero
		}
		
	static void funkcja(Integer zmienna)
	{zmienna=0;}
			}

... o czymś z pewnością nie wiem, oświećcie mnie...

1

zdaje się, że Java nie ma wbudowanej możliwości przekazywania referencji przez referencję.

1

Przykro mi ale zmiana wartości Integera powoduje stworzenie nowego obiektu (tak samo jak dla Stringa, Booleana etc). Musiałbyś napisać własny wrapper żeby tego uniknąć. Implementacja valueOf dla Integera w moim JDK wygląda tak:

    public static Integer valueOf(int i) {
        if(i >= -128 && i <= IntegerCache.high)
            return IntegerCache.cache[i + 128];
        else
            return new Integer(i);
    }

Więc jak widać zmiana wartości integera powoduje zwrócenie referencji do innego obiektu. Co istotne dzięki temu jeśli masz dwa obiekty Integer o tej samej wartości to mogą to być te same obiekty! (istotne kiedy próbujesz sobie coś synchronizować na takim obiekcie)

0

Musisz kombinować inaczej, w Javie wszystkie parametry przekazywane są przez wartość.

0

ehh... ale bzdura, dlaczego za każdym razem jak się zabieram za Java ten język mnie do siebie zniechęca...
no cóż, w takim wypadku będę korzystał z tablic, chyba najszybciej...

import java.io.*;
class Test	{
	public static void main(String args[])
	{	Console c = System.console();
		int i[] = new int[1];
		i[0]=Integer.parseInt(c.readLine("Podaj dowolna liczba calkowia rozna od zera: "));
		funkcja(i);
		System.out.println(i[0]);// zawsze oczekiwane zero
		}
		
	static void funkcja(int zmienna[])
	{zmienna[0]=0;}
			}
0

@Shalom
Zawsze żyłem w przekonaniu, że w Javie (każdej?) wszystkie argumenty są przekazywane przez wartość. O czymś nie wiem?

0

W javie wszystko oprócz prymitywów jest przekazywane przez referencje ;]

0
@spidPL napisał(a)

no cóż, w takim wypadku będę korzystał z tablic, chyba najszybciej...

A nie możesz tych wartości zwracać jak człowiek, poprzez return?

@Shalom napisał(a)

W javie wszystko oprócz prymitywów jest przekazywane przez referencje ;]

Na ten temat jest już mnóstwo flejmu w internecie. Jak są zwracane, wszyscy wiedzą, reszta to kwestia nazewnictwa.

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