Od razu zaznaczam, że z Javą mam do czynienia od niedawna - dopiero 2 semestr piszemy w niej na studiach. Przedtem pisałem w C++.
Mam taki problem:
Z kilku tutoriali dowiedziałem się, że przekazywanie parametrów do funkcji w Javie odbywa się tylko przez wartość. Trochę mnie to zdziwiło, bo w c++ miałem aż 3 możliwości na przekazanie argumentu, no ale co tam.
Już się do tego przyzwyczaiłem, ale pisząc pewien program napotkałem coś co mnie zdziwiło.
Ten dziw demonstruje poniższy programik:
public class test {
public test() {
}
public void funkcja1(){
int [][]tab2D = new int [2][2]; // to jest tablica testowa, dwuwymiarowa
int x=1;
int i,j;
for(i=0; i<2; ++i){
for(j=0; j<2; ++j){
tab2D[i][j]=1; // wypełniam ją jakimiś wartościami
}
}
System.out.println("Początkowo x=" + x);
System.out.println("Tablica na początku");
wypisz(tab2D);
funkcja2(tab2D[0],x); // zerowy wiersz tej tablicy do funkcji, która go zmodyfikuje
System.out.println("Po zakończeniu funkcji2, x=" + x);
System.out.println("Tablica po wykonaniu funkcji2");
wypisz(tab2D);
}
public void funkcja2(int tabl[], int w){
int i;
for(i=0; i<2; ++i){
tabl[i]=2; // modyfikacja wartości w tablicy
}
w=2;
}
public void wypisz(int tabl[][]){
int i,j;
for(i=0; i<2; ++i){
for(j=0; j<2; ++j){
System.out.println(tabl[i][j]);
}
}
}
static public void main( String arg[] ){
test foo = new test();
foo.funkcja1();
}
}
Wynik działania tego programu to:
Początkowo x=1
Tablica na początku
1
1
1
1
Po zakończeniu funkcji2, x=1
Tablica po wykonaniu funkcji2
2
2
1
1
Tak więc funkcja2 zmodyfikowała fragment tablicy, który jej przesłałem i wynik tych modyfikacji
jest widoczny "z zewnątrz".
O co chodzi ?
Dlaczego tak się stało, skoro parametry w Javie mają być przekazywane przez wartość ?
Przekazana do funkcji2 zmienna x zachowuje się tak jak podejrzewałem, nie zmienia wartości poza ciałem funkcji, no ale tablica została zaalokowana dynamicznie przy użyciu new (myślę, że tu jest pies pogrzebany).
Jak zmienić ten program, by funkcja2 nie modyfikowała przekazanej jej tablicy ?
W tej chwili omijam ten problem kopiując w funkcji2 tablicę przekazaną do niej jako argument i wykonując wszystkie operacje na tej kopii, ale jest to czasochłonne a ja potrzebuję szybko działającego programu.
( problem napotkałem pisząc midlet a wiadomo jak to jest z mocą obliczeniową komórek ).
Pomóżcie.