3.3 Scope - ajpaez/OCA GitHub Wiki

(OCA Objectives 1.1 and 2.5)

Scope de una variable

Existen cinco scope dependiente del alcance de la variable:

  • Class variables. Las variables estáticas tiene el mayor scope, son creadas cuando la clase se carga y sobreviven tanto tiempo como la clase esté cagada en la JVM
  • Instance variables. Las variables de instancia tiene un poco menos de scope, son creadas cuando una nueva instancia es creada y están vivas hasta que se elimina la instancia.
  • Method variables. Solo son accesibles desde el método que las define. El scope puede ser igual que una variable local o mayor pero nunca menor.
  • Local variables. Las variables locales tienen un poco menos, están vivas mientras el método al que pertenecen esta en el stack (también llamadas Method local). Tienen una peculiaridad, pueden estar vivas y aun así estar fuera del scope.
  • Block variables. Las variable de bloque están vivas solo mientras el bloque de código se esta ejecutando.

Acompañado del scope viene el concepto de shadowed, concepto que puede producir cuatro errores:

  • Intentar acceder a una variable de instancia desde un contexto estático (típicamente el main):
class ScopeErrors {
  int x = 5;
 public static void main(String[] args) {
    x++;   // won't compile, x is an 'instance' variable
  }
}
  • Intentar acceder a una variable local desde un método anidado distinto del que la declara.
class ScopeErrors {
  public static void main(String [] args) {
    ScopeErrors s = new ScopeErrors();
    s.go();
  }
  void go() {
    int y = 5;
    go2();
    y++;        // once go2() completes, y is back in scope
  }
  void go2() {
    y++;        // won't compile, y is local to go()
  }
}
  • Intentar usar una variable del bloque después de que el bloque haya sido ejecutado:
void go3() {
  for(int z = 0; z < 5; z++) {
    boolean test = false;
    if(z == 3) {
      test = true;
      break;
    }
  }
  System.out.print(test);   // 'test' is an ex-variable, it has ceased to be...
}
  • Duplicar una variable dentro del mismo scope:
 public class Ouch {
   static int ouch = 7;
  public static void main(String[] args) {
     new Ouch().go(ouch);
     System.out.print(" " + ouch);
   }
   void go(int ouch) {
     ouch++;
     for(int ouch = 3; ouch < 6; ouch++) //Compilation fails, duplicated ouch, parameter and for
       ;
    System.out.print(" " + ouch);
  }

En los dos últimos ejemplos el compilador será el que se queje de lo escrito: cannot find symbol