19. maj 2004 - 18:38Der er
9 kommentarer og 1 løsning
Call by Value i Java
Så vidt jeg har forstået benytter Java sig af Call by Value når man kalder en metode og sender en parameter med. Nu sidder jeg så og leger med noget sortering, hvor jeg tester tidskompleksitet for bubblesort. Jeg laver et array med nogle ramdom tal og sorterer dem, men min metode sorterer faktisk arrayet, selvom den ikke skulle. Neden for er et eksempel, for jeg ført udskriver det u-sorterede array derefter kalder jeg bubbleSort(num) som laver en sortering, men den laver faktisk sorteringen på num, selvom min metode ikke piller ved num, den benytter kun det paramter array den får sendt med. Det er her mit lidt mærkelige problem kommer ind, sorteringen bliver faktisk udført på num, hvilket jeg ville mene skulle kræve en call by reference. Er der nogle der kan forklare mig hvad der sker siden at den faktisk sortere num ?
int[] num = new int[10000];
for (int i = 0 ; i < num.length ; i++) num[i] = (int)(1+Math.random()*100);
bubbleSort(num);
for (int i = 0 ; i < num.length ; i++) System.out.print(num[i]+ " ");
selve bubbleSort metoden ser sådan her ud:
public static void bubbleSort(int[] numbers) { int temp;
for (int i = (numbers.length - 1); i >= 0; i--) { for (int j = 1; j <= i; j++) { if (numbers[j-1] > numbers[j]) { temp = numbers[j-1]; numbers[j-1] = numbers[j]; numbers[j] = temp; } } } }
Det er derfor at strengt formelt så er alle argumenter i Java by value, men i daglig tale siger man tit at simple data typer er by value mens objekter og arrays er by reference.
Det sidste er ikek teknisk korrekt, men det giver folk de rette associationer.
ok .. dvs at jeg får en ny pointer, men til samme objekt ? og ændringer i metoden bliver derfor "permanente", da jeg bare har en reference til objektet, eller hvordan ?
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.