Avatar billede roo104 Nybegynder
19. maj 2004 - 18:38 Der 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;                 
                }
            }
        }
    }


Håber i kan se hvad jeg mener :D
Avatar billede arne_v Ekspert
19. maj 2004 - 18:41 #1
I Java er et array et objekt, objekter eksisterer kun som referancer, du sender
ikke arrayet over by valye, du sender referencen over by value
Avatar billede arne_v Ekspert
19. maj 2004 - 18:43 #2
Så ændringer du laver i arrayet er der også udenfor.

Prøver du at lave:

numbers = new int[1];
numbers[0] = 123;

inde i metoden vil du se at den ændring ikke er der udenfor.

Fordi du kan ikke ændre referencen da den er pass by value.
Avatar billede arne_v Ekspert
19. maj 2004 - 18:44 #3
Hvis du kan kode i C/C++, så er

void bubbleSort(int[] numbers)

det samme som:

void bubbleSort(int *numbers)

Også her kan du ændre det som numbers peger på men ikke selve pointeren
Avatar billede arne_v Ekspert
19. maj 2004 - 18:45 #4
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.
Avatar billede arne_v Ekspert
19. maj 2004 - 18:46 #5
Og et svar
Avatar billede roo104 Nybegynder
19. maj 2004 - 18:47 #6
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 ?
Avatar billede roo104 Nybegynder
19. maj 2004 - 18:52 #7
number1 = new int[1];
number2[] = number1

giver mig bare to pointere til samme array ?

Hvis man i Java så vil have en "kopi" af et objekt er man så nødt til at bruge clone() ? eller hvordan klarer man sådan noget ?
Avatar billede arne_v Ekspert
19. maj 2004 - 18:56 #8
til 18:47:30 - ja
Avatar billede arne_v Ekspert
19. maj 2004 - 18:56 #9
18:52:40 - ja præcis
Avatar billede roo104 Nybegynder
19. maj 2004 - 18:58 #10
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester