G.Bordel >Docencia >TAP Técnicas Actuales de Programación (curso 2010-2011)
desprotegido Intro. desprotegido Temario desprotegido Calendario desprotegido RPF desprotegido Recursos protegido Práctica protegido Gest. Alum.
tema_anterior Tema 4: Elementos relacionados con la orientación a objeto tema_siguiente
  1. Objetos y clases.
  2. Estructura de la definición de una clase.
  3. Herencia.
  4. Encapsulamiento (ámbitos de accesibilidad).
  5. El bloque static y los atributos static y final.
  6. Instanciación, inicialización y eliminación de objetos.[ejercicios]
  7. Clases y métodos abstractos.[ejercicios]
  8. Interfaces.[ejercicios]
  9. Polimorfismo.
  10. Arrays*.[ejercicios]
  11. Enumeraciones.

4.4- Encapsulamiento (ámbitos de accesibilidad)

Palabras reservadas en Java
abstractbooleanbreakbytecasecatch
charclassconst*continuedefaultdo
doubleelseextendsfinalfinallyfloat
forgoto*ifimplementsimportinstanceof
intinterfacelongnativenewpackage
privateprotectedpublicreturnshortstatic
strictfp**superswitchsynchronizedthisthrow
throwstransienttryvoidvolatilewhile

Se ha mencionado ya que el concepto central en la tecnología de orientación a objeto es precisamente el de "objeto", pero que su potencia tiene su razon de ser en el hecho de que permite que el concepto de "encapsulamiento" alcance un desarrollo pleno no alcanzado con anterioridad.

Visto de un modo sencillo el encapsulamiento se consigue mediante un lenguaje de programación que aporte los mecanismos para posibilitar una politica de restricción de permisos de acceso desde unos elementos a otros. De este modo la parte visible de un elemento dado (clase u objeto) se puede limitar tanto como sea adecuado ajustandose a su funcionalidad conceptual y dejando "a salvo" de sus usuarios todo aquello que sólo tiene una funcionalidad interna. Esta "parte visible" es lo que se conoce como "interfaz" (aunque esta relacionado directamente, no debe confundirse este concepto de "interfaz" con los elementos concretos definibles en Java bajo la denominación de "interfaz").

En Java esto se consigue con la definición de cuatro ámbitos de accesibilidad que son aplicables a las clases y a sus componentes: los campos y los métodos. Cada elemento tiene asociado siempre un ámbito de accesibilidad por defecto que se conoce como "package" a no ser que se determine otro al definirlo aplicandole una de las palabras reservadas a tal efecto:public, protected, o private.

Ámbito de acceso
clase+paquete+subclases+todo
privateX   
packageXX  
protectedXXX 
publicXXXX

Como puede verse en la tabla, dentro de una clase todos los elementos son accesibles independientemente de que vayan calificados con cualquier palabra clave de ámbito. En particular, como el ámbito establecido por defecto es el de "package", si queremos restringir el acceso a un elemento sólo a la clase en que se define, será necesario especificarlo con "private".

El siguiente ámbito amplia la posibilidad de acceso al resto de clases definidas dentro del mismo paquete. Es el ámbito aplicado en caso de no especificar nada.

Con el siguiente ámbito se amplia la posibilidad de acceso permitiendolo a todas las subclases. En caso de que todas las subclases pertenecieran al mismo paquete no sería necesaria esta ampliación del ámbito de acceso, pero esto puede no ser así ya que nada impide que una subclase pertenezca a un paquete distinto de su clase padre (y un caso habitual puede ser aquel en que una subclase pertenece a su vez a un subpaquete del que aloja a la clase padre). Hay un aspecto de este ámbito de acceso que puede resultar poco claro: si la clase B extiende a la clase A, un objeto de clase B tendrá acceso a elementos heredados de A con el atributo de acceso protected de cualquier objeto de clase B que se le proporcione, pero no tendrá acceso a tales elementos de un objeto de clase A. Esto puede quedar más claro mediante el siguiente ejemplo:


 1-
 2-
 3-
 4-
 5-
 6-


package packA;

public class A {
    protected int i;
    // resto de definición de la clase
}


 1-
 2-
 3-
 4-
 5-
 6-
 7-
 8-
 9-
10-
11-


package packB;

import packA.A;

public class B extends A {
    void unMetodo(A a, B b) {
        a.i = 10;    // Ilegal. a pertenece a una clase de otro paquete.
        b.i = 10;    // Legal. b puede acceder a su miembro i heredado de la definición de A 
    }
    // resto de la definición de la clase
}

Por útimo, el atributo public permite el acceso al elemento desde cualquier otra clase independientemente de que este relacionada o no dentro de la estructura de paquetes o de herencia.

Para terminar este apartado, queda aclarar que en el caso de aplicar el atributo de accesibilidad a una clase, carecen de sentido tanto el private como el protected ya que regulan accesos a elementos dentro de la clase. Por tanto, las clases tan solo pueden llevar el atributo public o no llevarlo para determinar un acceso universal o dentro del paquete respectivamente. Además es este el momento de matizar una de las "verdades a medias" dichas con anterioridad: se decía que cada clase debía definirse en un fichero con su mismo nombre, pero esto es aplicable a clases públicas. En realidad un fichero puede contener una clase pública (la que le da nombre) y tantas como se precise con acceso package. (en cierto modo aún se trata de una verdad a medias puesto que más adelante hablaremos de clases "internas", pero esa es otra historia...)

Siguiente punto: 4.5- El bloque static y los atributos static y final


Plataforma de soporte a curso y contenidos (c) German Bordel 2005.