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

zwracanie wartości przez funkcję w parametrze(referencja)
SP
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 18
0

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

Kopiuj
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:

Kopiuj
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...

maszynaz
  • Rejestracja: dni
  • Ostatnio: dni
1

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

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
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:

Kopiuj
    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)

  • Rejestracja: dni
  • Ostatnio: dni
0

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

SP
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 18
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...

Kopiuj
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;}
			}
  • Rejestracja: dni
  • Ostatnio: dni
0

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

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
0

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

iooi
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 573
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.

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.