G.Bordel >Docencia >TAP | Técnicas Actuales de Programación | (curso 2010-2011) | |||||||
|
|||||||||
tema_anterior | Tema 4: Elementos relacionados con la orientación a objeto | tema_siguiente |
4.4- Encapsulamiento (ámbitos de accesibilidad)
Palabras reservadas en Java | |||||
abstract | boolean | break | byte | case | catch |
char | class | const* | continue | default | do |
double | else | extends | final | finally | float |
for | goto* | if | implements | import | instanceof |
int | interface | long | native | new | package |
private | protected | public | return | short | static |
strictfp** | super | switch | synchronized | this | throw |
throws | transient | try | void | volatile | while |
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 | |
private | X | |||
package | X | X | ||
protected | X | X | X | |
public | X | X | X | X |
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:
|
|
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. |