TutorJava Nivel Básico

Uno de los beneficos de las clases es que pueden proteger sus variables y m�todos miembros frente al acceso de otros objetos. �Por qu� es esto importante? Bien, consideremos esto. Se ha escrito una clase que representa una petici�n a una base de datos que contiene toda clase de informaci�n secreta, es decir, registros de empleados o proyectos secretos de la compa�ia.

Ciertas informaciones y peticiones contenidas en la clase, las soportadas por los m�todos y variables accesibles p�blicamente en su objeto son correctas para el consumo de cualquier otro objeto del sistema. Otras peticiones contenidas en la clase son s�lo para el uso personal de la clase. Estas otras soportadas por la operaci�n de la clase no deber�an ser utilizadas por objetos de otros tipos. Se querr�a proteger esas variables y m�todos personales a nivel del lenguaje y prohibir el acceso desde objetos de otros tipos.

En Java se pueden utilizar los especificadores de acceso para proteger tanto las variables como los m�todos de la clase cuando se declaran. El lenguaje Java soporta cuatro niveles de acceso para las variables y m�todos miembros: private, protected, public, y, todav�a no especificado, acceso de paquete.

La siguiente tabla le muestra los niveles de acceso pemitidos por cada especificador.

Especificador clase subclase paquete mundo
private X

�

�

�

protected X X* X

�

public X X X X
package X

�

X

�

La primera columna indica si la propia clase tiene acceso al miembro definido por el especificador de acceso. La segunda columna indica si las subclases de la clase (sin importar dentro de que paquete se encuentren estas) tienen acceso a los miembros. La tercera columna indica si las clases del mismo paquete que la clase (sin importar su parentesco) tienen acceso a los miembros. La cuarta columna indica si todas las clases tienen acceso a los miembros.

Observa que la intersecci�n entre protected y subclase tiene un '*' - este caso de acceso particular tiene una explicaci�n en m�s detalle m�s adelante.

Echemos un vistazo a cada uno de los niveles de acceso m�s detalladamente.

.�Private

El nivel de acceso m�s restringido es private. Un miembro privado es accesible s�lo para la clase en la que est� definido. Se utiliza este acceso para declarar miembros que s�lo deben ser utilizados por la clase. Esto incluye las variables que contienen informaci�n que si se accede a ella desde el exterior podr�a colocar al objeto en un estado de inconsistencia, o los m�todos que llamados desde el exterior pueden poner en peligro el estado del objeto o del programa donde se est� ejecutando. Los miembros privados son como secretos, nunca deben contarsele a nadie.

Para declarar un miembro privado se utiliza la palabra clave private en su declaraci�n. La clase siguiente contiene una variable miembro y un m�todo privados.

class Alpha {
    private int soyPrivado;
    private void metodoPrivado() {
        System.out.println("metodoPrivado");
    }
}

Los objetos del tipo Alpha pueden inspeccionar y modificar la variable soyPrivado y pueden invocar el m�todo metodoPrivado(), pero los objetos de otros tipos no pueden acceder. Por ejemplo, la clase Beta definida aqu�.

class Beta {
    void metodoAccesor() {
        Alpha a = new Alpha();
        a.soyPrivado = 10;      // ilegal
        a.metodoPrivado();      // ilegal
    }
}

no puede acceder a la variable soyPrivado ni al m�todo metodoPrivado() de un objeto del tipo Alpha porque Beta no es del tipo Alpha.

Si una clase est� intentando acceder a una variable miembro a la que no tiene acceso--el compilador mostrar� un mensaje de error similar a este y no compilar� su programa.

Beta.java:9: Variable iamprivate in class Alpha not accessible from class Beta.
        a.iamprivate = 10;     // ilegal
         ^
1 error

Y si un programa intenta acceder a un m�todo al que no tiene acceso, generar� un error de compilaci�n parecido a este.

Beta.java:12: No method matching privateMethod() found in class Alpha.
        a.privateMethod();         // ilegal
1 error

.�Protected

El siguiente especificador de nivel de acceso es 'protected' que permite a la propia clase, las subclases (con la excepci�n a la que nos referimos anteriormente), y todas las clases dentro del mismo paquete que accedan a los miembros. Este nivel de acceso se utiliza cuando es apropiado para una subclase de la clase tener acceso a los miembros, pero no las clases no relacionadas. Los miembros protegidos son como secretos familiares - no importa que toda la familia lo sepa, incluso algunos amigos allegados pero no se quiere que los extra�os lo sepan.

Para declarar un miembro protegido, se utiliza la palabra clave protected. Primero echemos un vistazo a c�mo afecta este especificador de acceso a las clases del mismo paquete.

Consideremos esta versi�n de la clase Alpha que ahora se declara para estar incluida en el paquete Griego y que tiene una variable y un m�todo que son miembros protegidos.

package Griego;

class Alpha {
    protected int estoyProtegido;
    protected void metodoProtegido() {
        System.out.println("metodoProtegido");
    }
}

Ahora, supongamos que la clase Gamma, tambi�n est� declarada como miembro del paquete Griego (y no es una subclase de Alpha). La Clase Gamma puede acceder legalmente al miembro estoyProtegido del objeto Alpha y puede llamar legalmente a su m�todo metodoProtegido().

package Griego;

class Gamma {
    void metodoAccesor() {
        Alpha a = new Alpha();
        a.estoyProtegido = 10;    // legal
        a.metodoProtegido();    // legal
    }
}

Esto es muy sencillo. Ahora, investiguemos c�mo afecta el especificador protected a una subclase de Alpha.

Introduzcamos una nueva clase, Delta, que desciende de la clase Alpha pero reside en un paquete diferente - Latin. La clase Delta puede acceder tanto a estoyProtegido como a metodoProtegido(), pero solo en objetos del tipo Delta o sus subclases. La clase Delta no puede acceder a estoyProtegido o metodoProtegido() en objetos del tipo Alpha. metodoAccesor() en el siguiente ejemplo intenta acceder a la variable miembro estoyProtegido de un objeto del tipo Alpha, que es ilegal, y en un objeto del tipo Delta que es legal.

Similarmente, metodoAccesor() intenta invocar a metodoProtegido() en un objeto del tipo Alpha, que tambi�n es ilegal.

import Griego.*;

package Latin;

class Delta extends Alpha {
    void metodoAccesor(Alpha a, Delta d) {
        a.estoyProtegido = 10;    // ilegal
        d.estoyProtegido = 10;    // legal
        a.metodoProtegido();    // ilegal
        d.metodoProtegido();    // legal
    }
}

Si una clase es una subclase o se cuentra en el mismo paquete de la clase con el miembro protegido, la clase tiene acceso al miembro protegido.

.�Public

El especificador de acceso m�s sencillo es 'public'. Todas las clases, en todos los paquetes tienen acceso a los miembros p�blicos de la clase. Los miembros p�blicos se declaran s�lo si su acceso no produce resultados indeseados si un extra�o los utiliza. Aqu� no hay secretos familiares; no importa que lo sepa todo el mundo.

Para declarar un miembro p�blico se utiliza la palabra clave public. Por ejemplo,

package Griego;

class Alpha {
    public int soyPublico;
    public void metodoPublico() {
        System.out.println("metodoPublico");
    }
}

Reescribamos nuestra clase Beta una vez m�s y la ponemos en un paquete diferente que la clase Alpha y nos aseguramos que no est�n relacionadas (no es una subclase) de Alpha.

import Griego.*;

package Romano;

class Beta {
    void metodoAccesor() {
        Alpha a = new Alpha();
        a.soyPublico = 10;       // legal
        a.metodoPublico();       // legal
    }
}

Como se puede ver en el ejemplo anterior, Beta puede inspeccionar y modificar legalmente la variable soyPublico en la clase Alpha y puede llamar legalmente al m�todo metodoPublico().

.�Acceso de Paquete

Y finalmente, el �ltimo nivel de acceso es el que se obtiene si no se especifica ning�n otro nivel de acceso a los miembros. Este nivel de acceso permite que las clases del mismo paquete que la clase tengan acceso a los miembros. Este nivel de acceso asume que las clases del mismo paquete son amigas de confianza. Este nivel de confianza es como la que extiende a sus mejores amigos y que incluso no la tiene con su familia.

Por ejemplo, esta versi�n de la clase Alpha declara una variable y un m�todo con acceso de paquete. Alpha reside en el paquete Griego.

package Griego;

class Alpha {
    int estoyEmpaquetado;
    void metodoEmpaquetado() {
        System.out.println("metodoEmpaquetado");
    }
}

La clase Alpha tiene acceso a estoyEmpaquetado y a metodoEmpaquetado().

Adem�s, todas las clases declaradas dentro del mismo paquete como Alpha tambi�n tienen acceso a estoyEmpaquetado y metodoEmpaquetado().

Supongamos que tanto Alpha como Beta son declaradas como parte del paquete Griego.

package Griego;

class Beta {
    void metodoAccesor() {
        Alpha a = new Alpha();
        a.estoyEmpaquetado = 10;     // legal
        a.metodoEmpaquetado();     // legal
    }
}

Entonces Beta puede acceder legalmente a estoyEmpaquetado y metodoEmpaquetado().

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP