Documente Academic
Documente Profesional
Documente Cultură
CONTROL DE ACCESO
En C++ el control de acceso es menos complicado que en Java. Cualquier miembro individual
de una clase en C++, puede ser designado como: private, public o protected.
Un miembro private solamente puede ser accedido por otros miembros de la propia clase; no
puede ser accedido por miembros de una clase heredada. Es la designación más restrictiva de
todas.
Un miembro designado como public puede ser accedido desde cualquier código dentro del
ámbito de un objeto instanciado a partir de la clase. Es la designación menos restrictiva.
La designación de protected entra en juego solamente cuando se ve involucrada la herencia.
Un miembro designado como protected aparece como public para los miembros de clases
derivadas de la clase y aparece como private para todas las demás.
En C++ hay un segundo nivel de control de acceso con las mismas palabras reservadas, que no
tiene analogía en Java, y que se aplica a nivel de la herencia de una clase desde otra clase.
También en C++, hay un aspecto adicional que son las funciones friend de una clase. Estas
funciones tienen acceso a todos los miembros privados y protegidos de esa clase. Esta función
puede ser una función miembro de otra clase o simplemente una función aislada (que no está
soportada en Java). Java no tiene nada semejante a las funciones friend de C++.
El control de acceso se aplica siempre a nivel de clase, no a nivel de objeto. Es decir, los
métodos de instancia de un objeto de una clase determinada tienen acceso directo a los
miembros privados de cualquier otro objeto de la misma clase.
En Java, el control de acceso se complica un poco por la inclusión de la noción de package
(paquete). Java implementa los mismos tres especificadores de acceso que C++ (aunque no
necesariamente con el mismo significado) y, además, implementa ese cuarto especificador si no
se ha indicado ninguno de los otros tres, que es el definido como package, default o friendly.
Por lo tanto, cuando se crea una nueva clase en Java, se puede especificar el nivel de acceso
que se quiere para las variables de instancia y los métodos definidos en la clase: private,
protected, public y package.
La tabla siguiente muestra el nivel de acceso que está permitido a cada uno de los
especificadores:
PRIVATE
private String NumeroDelCarnetDeIdentidad;
Las variables y métodos de instancia privados sólo pueden ser accedidos desde dentro de la
clase. No son accesibles desde las subclases de esa clase. Hay que resaltar una vez más, que
un método de instancia de un objeto de una clase puede acceder a todos los miembros
privados de ese objeto, o miembros privados de cualquier otro objeto de la misma clase. Es
decir, que en Java el control de acceso existe a nivel de clase, pero no a nivel de objeto de la
clase.
PUBLIC
public void CualquieraPuedeAcceder(){}
Cualquier clase desde cualquier lugar puede acceder a las variables y métodos de instancia
públicos.
PROTECTED
protected void SoloSubClases(){}
Sólo las subclases de la clase y nadie más puede acceder a las variables y métodos de instancia
protegidos. Los métodos protegidos pueden ser vistos por las clases derivadas, como en C++, y
también, en Java, por los paquetes. Todas las clases de un paquete pueden ver los métodos
protegidos de ese paquete. Esto difiere significativamente de C++, en donde los miembros
protegidos solamente pueden ser accedidos por miembros de la misma clase o miembros de
subclases.
ENCAPSULAMIENTO
Como se puede observar de los diagramas, las variables del objeto se localizan en el centro o
núcleo del objeto. Los métodos rodean y esconden el núcleo del objeto de otros objetos en el
programa. Al empaquetamiento de las variables de un objeto con la protección de sus métodos
se le llama encapsulamiento. Típicamente, el encapsulamiento es utilizado para esconder
detalles de la puesta en práctica no importantes de otros objetos. Entonces, los detalles de la
puesta en práctica pueden cambiar en cualquier tiempo sin afectar otras partes del programa.
El encapsulamiento de variables y métodos en un componente de software ordenado es,
todavía, una simple idea poderosa que provee dos principales beneficios a los desarrolladores
de software:
Modularidad, esto es, el código fuente de un objeto puede ser escrito, así como darle
mantenimiento, independientemente del código fuente de otros objetos. Así mismo, un
objeto puede ser transferido alrededor del sistema sin alterar su estado y conducta.
Ocultamiento de la información, es decir, un objeto tiene una "interfaz publica" que
otros objetos pueden utilizar para comunicarse con él. Pero el objeto puede mantener
información y métodos privados que pueden ser cambiados en cualquier tiempo sin
afectar a los otros objetos que dependan de ello.
Los objetos proveen el beneficio de la modularidad y el ocultamiento de la información. Las
clases proveen el beneficio de la reutilización. Los programadores de software utilizan la misma
clase, y por lo tanto el mismo código, una y otra vez para crear muchos objetos.
En las implantaciones orientadas a objetos se percibe un objeto como un paquete de datos y
procedimientos que se pueden llevar a cabo con estos datos. Esto encapsula los datos y los
procedimientos. La realidad es diferente: los atributos se relacionan al objeto o instancia y los
métodos a la clase. ¿Por qué se hace así? Los atributos son variables comunes en cada objeto
de una clase y cada uno de ellos puede tener un valor asociado, para cada variable, diferente al
que tienen para esa misma variable los demás objetos. Los métodos, por su parte, pertenecen
a la clase y no se almacenan en cada objeto, puesto que sería un desperdicio almacenar el
mismo procedimiento varias veces y ell o va contra el princi pi o de reutilización de código.
Imaginemos que se crea una clase, una docena de programadores tienen acceso a dicha clase
y la utilizan a discreción, posteriormente dicha clase comienza a comportarse de una manera
inesperada debido a que los valores que algunas variables han tomado no fueron anticipados y
todo comienza a desmoronarse. Para corregir el problema se crea una versión más nueva de
dicha clase y listo.
Mantener las variables de instancia protegidas (puede ser con un modificador de acceso,
p.ej., private)
Hacer métodos de acceso públicos para forzar al acceso a las variables por medio de dichos
métodos en lugar de acceder directamente.
Utilizar las convenciones de código para los nombres de los métodos, p. ej., set y get.
class AccesoIndirecto{
public static void main(String[] args){
MiClase mc = new MiClase();
mc.setTipo(5);
System.out.println("El tipo es:" + mc.getTipo());
}
}
Si nos fijamos un poquito, en el método setTipo() no existen validaciones para prevenir que un
valor no válido sea asignado a la variable, sin embargo, el proveer de un método de este tipo
desde el diseño inicial de la aplicación nos permite posteriormente modificar el comportamiento
de la misma sin afectar los métodos utilizados, tal vez en un futuro se desee que dicha variable
solamente pueda tener uno entre un rango de valores y se podrán aplicar posteriormente los
cambios sin que haya repercusiones negativas.
THIS
Al acceder a variables de instancia de una clase, la palabra clave this hace referencia a los
miembros de la propia clase en el objeto actual; es decir, this se refiere al objeto actual sobre el
que está actuando un método determinado y se utiliza siempre que se quiera hace referencia al
objetoactual de la clase. Volviendo al ejemplo de MiClase, se puede añadir otro constructor de
la forma siguiente:
public class MiClase {
int i;
public MiClase() {
i = 10;
}
// Este constructor establece el valor de i
public MiClase( int valor ) {
this.i = valor; // i = valor
}
// Este constructor también establece el valor de i
public MiClase( int i ) {
this.i = i;
}
public void Suma_a_i( int j ) {
i = i + j;
}
}
Aquí this.i se refiere al entero i en la clase MiClase, que corresponde al objeto actual. La
utilización de this en el tercer constructor de la clase, permite referirse directamente al objeto
en sí, en lugar de permitir que el ámbito actual defina la resolución de variables, al utilizar i
como parámetro formal y después this para acceder a la variable de instancia del objeto actual.
La utilización de this en dicho contexto puede ser confusa en ocasiones, y algunos
programadores procuran no utilizar variables locales y nombres de parámetros formales que
ocultan variables de instancia. Una filosofía diferente dice que en los métodos de inicialización y
constructores, es bueno seguir el criterio de utilizar los mismos nombres por claridad, y utilizar
this para no ocultar las variables de instancia. Lo cierto es que es más una cuestión de gusto
personal que otra cosa el hacerlo de una forma u otra.
La siguiente aplicación de ejemplo, utiliza la referencia this al objeto para acceder a una
variable de instancia oculta para el método que es llamado.
class javathis {
// Variable de instancia
int miVariable;
// Constructor de la clase
public javathis() {
miVariable = 5;
}
SUPER
Si se necesita llamar al método padre dentro de una clase que ha reemplazado ese método, se
puede hacer referencia al método padre con la palabra clave super:
import MiClase;
public class MiNuevaClase extends MiClase {
public void Suma_a_i( int j ) {
i = i + ( j/2 );
super.Suma_a_i( j );
}
}
/**
* Este ejemplo muestra el uso del puntero "super" para acceder
* al constructor de la clase padre. Tambien ilustra el uso de
* "super" para resolver la ambiguedad entre las variables
* local y de instancia en la superclase
*/
class base {
int datoBase;
public base() {
System.out.print( "Dentro del Constructor de la clase base" );
System.out.println( "Asignando a datoBase 100" );
datoBase = 100;
}
}
// Constructor de la Subclase
public javasuper() {
// Llamada al constructor de la clase base
super();
System.out.print( "Dentro del Constructor de la subclase" );
System.out.println( "Asignando a datoSubClase 200" );
datoSubClase = 200;
}