En PC Resumen hablaremos del control de acceso en Java. El encapsulamiento relaciona los datos con el código que las manipula, pero además el encapsulamiento proporciona otro atributo importante: el control de acceso. Con el encapsulamiento se puede controlar el acceso de miembros de una clase a las partes del programa. Controlando el acceso se puede prevenir un uso indebido. Por ejemplo, si sólo se permite el acceso a los datos a través de métodos bien definidos, se impide una mala utilización de estos datos. Por lo tanto, cuando se implementa correctamente una clase, se crea una caja negra que puede utilizarse pero el funcionamiento interno no está abierto a la actuación externa.

El especificador de acceso determina cómo puede accederse a un miembro de la clase modificando su declaración. Java proporciona un conjunto de especificadores de acceso. Algunos aspectos de control están más relacionados con la herencia o los paquetes y esto ya se verá más adelante. Ahora, comenzaremos examinando el control de acceso tal y como se aplica a una sola clase.

Los especificadores de acceso son public, protected y private. El especificador protected sólo tiene sentido cuando interviene la herencia. Ahora veremos los otros dos.

Cuando a un miembro de una clase se le aplica el especificador público, se puede acceder a este miembro para cualquier código del programa. Cuando el miembro especifica private, únicamente será accesible a través de otros miembros de la clase. Cuando no se utiliza ningún especificador de acceso, el miembro de una clase se predeterminado público dentro de su paquete, pero no se puede acceder desde fuera de su paquete. Más adelante ya hablaremos de los paquetes.

Hasta ahora, todas las clases desarrolladas han sido públicas, pero esto no es lo más habitual. Normalmente, se quiere restringir el acceso a los datos de una clase, sólo permitiendo el acceso a través de los métodos. A veces también, se definen métodos privados para una clase.

El especificador de acceso precede al resto de especificaciones de tipo de un miembro. Vemos un programa de ejemplo:

class Test {
    int a; // acceso predeterminado.
    public int b; // acceso público.
    private int c; // acceso privado.

    // métodos para acceder a c.

    void ECTS (int i) { // Se establece el valor de c.
        c = y;
    }
   
    int getc () {// Se obtiene el valor de c.
        return c;
    }
}

class AccessTest {
    public static void main (String args []) {
        Test ob = new Test ();
 
        // Estos son correctos y se puede acceder directamente a a y b.

        ob.a = 10;
        ob.b = 20;

        // Esto no es correcto

        // ob.c = 100; // Error!

        // Se debe acceder a c a través de sus métodos.

        ob.setc (100); // OK
        System.out.println ( "a, b, y c:" + ob.a + "" +
        ob.b + "" + ob.getc ());
    }
}

Si elimináramos el comentario de la línea // ob.c = 100; sería imposible compilar el programa porque habría violación de acceso.

Aunque los métodos normalmente proporcionan una acceso a los datos definidos por una clase, esto no tiene por qué ser siempre así. De todas formas, la mayoría de clases reales, será necesario permitir operaciones sobre los datos sólo a través de sus métodos. Esto es especialmente importante cuando se involucran cuestiones de herencia.

Static

Puede haber ocasiones en las que se quiera definir un miembro de clase que se utilizará independientemente de cualquier objeto de esta clase. Normalmente, sólo se puede acceder a un miembro de la clase utilizando un objeto de esta clase, pero también es posible crear un miembro que pueda usarse a sí mismo sin referencia a una instancia específica. Para crear un miembro de este tipo, es necesario que la declaración vaya precedida de la palabra clave static. Cuando un miembro se declara static, puede accederse a él antes de que se haya creado ningún objeto de su clase, y sin referencia a ningún objeto. Se pueden declarar static tanto métodos como variables. El ejemplo más común es el método main el que se declara static porque hay que llamar antes de que exista ningún objeto. Las variables de instancia declaradas como static son básicamente variables globales. Cuando se declaran los objetos de clase, no se hace ninguna copia de las variables static. En cambio, todas las instancias de clase comparten la misma variable.

Los métodos declarados static tienen algunas restricciones:

  • Sólo pueden llamar a otros miembros declarados static
  • Sólo pueden acceder a datos static
  • De ninguna manera poder hacer referencia a este o a super (esta palabra está relacionada con la herencia y la veremos más adelante).

Si lo que se necesita es hacer un cálculo en lugar de inicializar las variables static, puede declararse un bloque static que se ejecute una sola vez, cuando se carga la clase por primera vez. Vemos el siguiente ejemplo:

class UsStatic {
    static int a = 3;
    static int b;
    static void meth (int x) {
        System.out.println ( "x =" + x);
        System.out.println ( "a =" + a);
        System.out.println ( "b =" + b);
    }
    static {
        System.out.println ( "Static bloque inicializado.");
        b = a * 4;
    }
    public static void main (String args []) {
        meth (42);
    }
}

Todas las sentencias static ejecutan en cuando se carga la clase UsStatic. En primer lugar, se le asigna 3 a la variable a, después ejecuta el bloque static y finalmente se llama al main.

Fuera de la clase en el que están definidos, los métodos y variables static pueden usarse independientemente de cualquier objeto. Para hacerlo sólo es necesario especificar el nombre de la clase seguido del operador punto.

Final

Puede declararse una variable como final para prevenir que su contenido sea modificado. Esto significa que debe inicializar una variable final en el momento de ser declarada. De hecho estamos declarando constantes (lo que haríamos con #define).
Un convenio muy común es el de elegir identificadores en mayúsculas para las variables final. Esta palabra también se puede aplicar a los métodos, pero su significado es muy diferente y ya lo veremos cuando hablamos de herencia.

Pin It