18/10/2018

Java 08: Argumenti funkcije

U prošloj lekciji prošli smo deklaraciju I poziv funkcije. Ono što smo ostavili za ovu lekciju je način prosleđivanja argumenata. Kao što smo videli funkciji se mogu proslediti argumenti. U definiciji funkcije treba se napisati tip argumenta i njegov naziv, dok se pri pozivu prosleđuje vrednost međutimpostje još dve veoma važne stvari koje morate da znate.

Domen promenljivih

Kao što smo u funkciji main inicijalizovali nove promenljive tako to možemo uraditi i u bilo kojoj drugoj funkciji. Međutim postavlja se pitanje gde te promenljive možemo koristiti. Tj. u kom delu koda im možemo pristupiti. Odgovor je prost. Promenljivim inicijalizovanim u jednoj funkciji možemo pristupiti samo u toj funkciji. Ukoliko promenljivu iz funkcije A hoćemo da koristimo u funkciji B moramo proslediti tu promenljivu kao argument funkcije B.

Primer:
Kod:
public class HelloWorld{

     public static void main(String []args){
        int a = 10;
        funkcija();
     }
     
     static void funkcija() {
         System.out.println("a = " + a);
     }
}
Ispis:

HelloWorld.java:8: error: cannot find symbol
System.out.println(“a = ” + a);
^
symbol: variable a
location: class HelloWorld
1 error

Komentar: Primećujemo da nam Java javlja grešku, zato što pokušavamo da u funkciji koristimo promenljivu koja je definisana u mainu.

Da bi mogli da koristimo promenljivu moramo je proslediti kao argument:

Kod:
public class HelloWorld{

     public static void main(String []args){
        int a = 10;
        funkcija(a);
     }
     
     static void funkcija(int a) {
         System.out.println("a = " + a);
     }
}
Ispis:

a = 10

Način prosleđivanja

Druga stvar o kojoj mora da se vodi računa kod prosleđivanja je šta se prosleđuje. U javi postoje dva načina prosleđivanja argumenata:

  • Po vrednosti
  • Po referenci

Prosleđivanje parametara po  vrednosti.

Na ovaj način java prosleđuje sve proste tipove (int, char, double itd.). Funkciji se prosleđuje vrednost promenljive, koja se smeša u novi promenljivu. To praktično znači da svaka izmena prosleđene promenljive neće uticati na originalnu. Drugim rečima u funkciji pravimo kopiju prvobitne promenljive i sve operacije koje vršimo se vrše nad tom kopijom, a ne nad originalnom promenljivom iz prve funkcije. Ovaj princip je najbolje videti na primeru

Kod:
public class HelloWorld{

     public static void main(String []args){
        int a = 10;
        funkcija(a);
         System.out.println("U main a = " + a);
     }
     
     static void funkcija(int a) {
         a++;
         System.out.println("U funkciji a = " + a);
     }
}
Ispis:
U funkciji a = 11
U main a = 10

Komentar: Vidimo da smo iz main funkcije kao argument preneli promenljivu int a, a zatim smo u funkciji povećali vrednost te promenljive za jedan i ispisali. Kada se sve to završi, iz main funkcije ispisujemo takođe promenljivu int a. Brojevi nisu isti, povećavanje vrednost i ispis unutar funkcije se vršio nad kopijom promenljive iz maina, a ne nad samom prosleđenom promenljivom, s’toga izmena a++ nije uticala na promenljivu a iz main funkcije.

 

Prosleđivanje po referenci

Svi ostali tipovi podataka (jedini za sada rađen je niz) izuzev osnovnih se prosleđuju na ovaj način. Prosleđivanje po referenci funkcioniše tako što se funkciji ne prosleđuje vrednost promenljive, već referenca. Referenca pokazuje Javi gde se ta promenljiva nalazi u memoriji i zahvaljujući  njoj java može direktno da menja vrednost promenljive. Rezultat ovoga je da prilikom prosleđivanja promenljive po referenci svaka promena unutar funkcije utiče i na originalnu promenljivu, za razliko od prosleđivanja po vrednosti.

Primer:
Kod:
public class HelloWorld{

     public static void main(String []args){
        int[] a = {1, 2, 3};
        funkcija(a);
         System.out.println("U main a = " + a[1]);
     }
     
     static void funkcija(int[] a) {
         a[1]++;
         System.out.println("U funkciji a = " + a[1]);
     }
}
Ispis:

U funkciji a = 3
U main a = 3

Komentar: U ovom primeru vidimo da je izmena vrednosti člana niza uticala I na niz u mainu, to je upravo zbog toga što se niz prosleđuje kao referenca, a ne vrednost. Funkcija “funkcija” dobija upravo niz “a”, umesto kopije (kako stvari funkcionišu sa osnovnim tipovima), tako da svaka promena unutar funkcije utiče I na promenljivu u main funkciji.

Prethodna lekcija

Sledeća lekcija

Share

You may also like...

Leave a Reply

Your email address will not be published. Required fields are marked *