Scope, opseg

Svaka varijabla u Javi ima svoj scope.
Scope je dio programa u kom je ta varijabla vidljiva tj. može se tu koristiti.
Scope-ovi mogu biti ugniježdeni.
Unutrašnji scope može vidjeti tj. koristiti varijable iz vanjskog scope.
Unutrašnji scope može definisati novu varijablu koja se zove isto kao varijabla u vanjskom scope!

Postoje dva najvažnija scope-a a to su: scope klase i scope metode.
Scope metode je ugniježden u scope klase.
Npr. polja klase se mogu koristiti u metodama, ali varijable definisane u metodi se ne mogu koristiti u klasi:

class Abc {
    int x = 5;
    // int z = y + 2; // ovo nije dozvoljeno
  
    void bla() {
        int y = x + 1;
    }
    
    void meh() {
        int y = x + 3;
    }
}

Na liniji 3. vidimo primjer nedozvoljene operacije. Ako se pitate zašto:

Polja objekta se inicijalizuju čim se pozove konstruktor te klase.
Metode se pozivaju na zahtjev tj. ručno, on-demand.
Zato nam Java ne dozvoljava tu operaciju.
Također, kompajler ne zna na koje y mislimo, da li ono iz bla() ili iz meh()... :)

Primijetite i to da varijabla y iz bla() nema nikakve veze s varijablom y iz meh()!!!
To su dva skroz nezavisna bloka, svaki ima svoj scope.


Neki primjeri nedozvoljenog definisanja varijabli su dati u metodi ne().
Otkomentarišite liniju po liniju da vidite šta će vam kompajler reći.
U metodi da() dati su neki primjeri dozvoljenog korištenja istoimenih varijabli.

static void ne() {
    int x = 1;
    {
        // int x = 1; // nope
    }
    
    {
        int y = 1;
    }
    // y++; // ne može se koristiti izvan bloka! (isto je i za if, for, while, switch)
    
    // for(int x = 1; x < 5; x++) { }  // x vec definisano na pocetku metode
    
    // while(true) { int x = 1; }      // x vec definisano na pocetku metode
    
    for(int i = 1; i < 5; i++) {
        // for(int i = 1; i < 5; i++) {  } // i vec definisano u vanjskoj petlji
    }  
}

int duzina;
static void da() {
  
    // zasjenjivanje polja (shadowing)
    // pošto metoda ima svoj scope, 
    // dozvoljeno joj je uvesti novu varijablu istog imena kao polje klase
    int duzina = 5;
    
    // različiti blokovi
    {
        String str = "abc";
    }
    {
        String str = "abc"; // yep, nije na istom NIVOU
    }
    
    // različite petlje/blokovi
    for(int x = 1; x < 5; x++) { }
    for(int x = 1; x < 5; x++) { } // fercera
    
}