Modificadores de acceso

Tipo de acceso o visibilidad

Hacia el exterior del objeto, los atributos y métodos son accesibles especificando el objeto (instancia de una clase) seguido de un punto y el elemento al que se refiere (atributo o método). Java permite establecer tres niveles de acceso o visibilidad para los elementos:

  • public
  • private
  • protected

Cualquiera de estas tres palabras se escriben al inicio de elemento al que se le va a indicar la visibilidad. El diagrama sintáctico para el modificador de tipo de acceso o visibilidad es el siguiente:

Modificadores de acceso

Por defecto, si se omite el modificador de accesibilidad, el elemento se considera como público o accesible desde el exterior.

Un elemento público (public) puede referenciarse desde exterior mediante la notación objeto.elemento cuando nos referimos a una instancia; o de la forma Clase.elemento cuando nos referimos a un elemento (atributo o método) que es de clase o que no es instanciable.

Es decir, que desde el exterior del objeto puede utilizarse un atributo o invocarse un método para que se ejecute una acción. Por ejemplo, para la clase Perro:

public class Perro {

public String nombre;

public void ladrar() {}

}

En algún método exterior podría instanciarse en un objeto miPerrito y cambiarle el nombre o llamarlo desde el exterior:

miPerrito.nombre = "Firulais";

miPerrito.ladrar();

En UML se sustituye con un simbolo “+”:

Modificadores de acceso

Un elemento privado (private) no puede referenciarse desde exterior mediante la notación objeto.elemento. Es decir, que desde el exterior del objeto puede utilizarse o modificarse un atributo o invocarse un método para que se ejecute una acción; de hecho, para el exterior es como si no existiera ese elemento y sólo puede utilizarse en el interior del código de la declaración de clase.

Por ejemplo, para la clase Boveda:

public class Aplicacion {

private String contrasena;

private void abrir() {}

}

En algún método exterior donde se tuviera un objeto miApp derivado de la clase Aplicacion, al intentar tener acceso a la contrasena o intentar abrir() la aplicación sin permiso, me indicará un error de que no se conoce o no se tiene acceso al atributo o método:

System.out.println(miApp.misJoyas); // no se puede ejecutar esta instruccion

miApp.abrir(); // no se puede ejecutar esta instruccion

En UML se sustituye con un simbolo “-”:

Modificadores de acceso

En una jerarquía de objetos un elemento protegido (protected) puede referenciar en el código de la clase o en las clases derivadas o heredadas a partir de la clase base, mediante la notación objeto.elemento. Es decir, fuera de la jerarquía se comporta como private, mientras que para la clase base y sus clases derivadas es accesible como si se tratara de un elemento public.

Por ejemplo, para la clase CuentaBancaria:

public class CuentaBancaria {

protected double saldo;

protected double dejarEnCeros() {}

}

En algún método exterior donde se tuviera un objeto miCuenta derivado de la clase CuentaBancaria, al intentar tener acceso al saldo o intentar dejarEnCeros() a la cuenta sin permiso, me indicará un error de que no se conoce o no se tiene acceso al atributo o método:

System.out.println(miApp.misJoyas); // no se puede ejecutar esta instruccion

miApp.abrir(); // no se puede ejecutar esta instruccion

Pero en otras cuentas bancarias derivadas como CuentaDeCheques, CuentaDeAhorro, TarjetaDeCredito si podría hacerse uso del mecanismo anterior.

No se sugiere el abusar de esta prestación, aunque Java lo permite por cuestiones de rendimiento en recursos de memoria o para optimizar la velocidad.

En UML se sustituye con un simbolo “#”:

Modificadores de acceso

Modificadores de instancia o clase

Adicionalmente pueden definirse dos formas de inclusión de los elementos (atributos y métodos) dentro de una Clase:

  • de instancia, y
  • estáticos (static) o de clase, y

Además, puede agregarse la palabra final para indicar que no pueden modificarse.

Elementos de instancia

Se crea una copia de cada atributo cuando se crea instancia, por ejemplo cada Persona tiene su propio nombre, estatura, peso e índice de masa corporal. Así la instancia juan se llamará "Juan Pérez", medirá 1.80, tendrá un peso de 80 y un IMC de 24.69; mientras que un objeto maria se llama "María López", medirá 1.65, pesará 60 y tendrá un IMC de 22.04; y así para cada copia, instancia u objeto de la clase Persona.

Los métodos de instancia sólo se aplican para cada objeto, por ejemplo calcularIMC(), calcularArea(), acelerar(), depositar() o cancelarCuenta() sólo pueden ejecutarse si se refieren a una instancia que se haya creado en la memoria de la computadora.

Para declarar que un elemento (atributo o método) que es de «instancia», no se agrega un modificador.

Por ejemplo:

public class Persona {

private /* no va nada aquí */ String nombre;

public /* no va nada aquí */ void asignarNombre();

}

Para poder utilizarlo, es necesario declarar e inicializar una instancia u objeto para referirse al elemento:

// ...

Persona instancia = new Persona();

instancia.asignarNombre();

Elementos de clase

Para los elementos de clase no es necesario crear un objeto o instancia de la clase. Si son atributos, el mismo atributo se comparte por todos los elementos de la clase. Por ejemplo, podrías tener un contador de cuantos objetos de la clase se han creado hasta cierto momento y sólo incrementarlo en el constructor.

public class Sesion {

private static int numeroDeSesiones;

public Sesion() {

Sesiones.numeroDeSesiones++;

}

}

Para poder utilizarlo no usas el identificador de una instancia, en su lugar se escribe el identificador de la Clase. Otro uso muy común para los atributos es la creación de constantes que son utilizables desde el exterior de la clase y que sirven como referencias desde el exterior. Como pueden ser la constante Math.PI, o Double.POSITIVE_INFINITE.

Los métodos de clase se utilizan directamente con el identificador de clase y son utilizados para crear librerías disponibles para varios programas, como la clase Math.

El modificador final tiene tres usos que se refieren a que el elemento no puede modificarse:

  • En atributos, indica que no puede modificarse el valor después de la primera asignación. Es decir, es el equivalente en otros lenguajes a declarar una constante. Estos identificadores se escriben con mayúscula.
  • En métodos, indica que no puede heredarse el método.
  • En clases, indica que no puede heredarse o tener. Es decir, ya no pueden agregarse crearse subclases para agregar atributos o métodos o sobrescribir métodos.

Por ejemplo, la declaración de la clase Math sería similar a:

public final class Math {

// …

public static final double PI = 3.141592653;

// …

public static final double tan(double angulo) {

// …

}

}

Como puede observarse el uso de los modificadores static (para elementos de clase) y final (no modificable) sin opcionales. Por defecto se considerará en el primer caso como «elemento de instancia» y en el segundo como un elemento «modificable».

Modificadores de acceso

Algunas clases pueden tener elementos de instancia y de clase (static) en una misma clase. Por ejemplo la clase Double (se usa para representar un dato primitivo double como una clase) de Java tiene una definición similar a la siguiente.

Los elementos static representan una “librería” que puede utilizarse sin instanciar los objetos y se llaman con el nombre de la Clase.

Los elementos que no incluyen el modificador static se llaman por cada instancia creada a partir de la clase.

Escribir

Ingresa a la página de documentación de la clase Math, revisa los campos y métodos disponibles las páginas que se indican, y responde las siguientes preguntas. Observa el ejemplo.

Ingresa a la:

¿Con qué atributo (Field) puede obtener el valor de π?

Math.PI

¿Cómo se llama la clase?

Math

¿Qué palabra aparece al principio de todas las declaraciones de atributos (fields) y métodos (methods)?

static

Esta palabra indica que los atributos y métodos son de

Clase

Como puedes obtener el valor absoluto de -6

Math.abs( -6 )
Es necesario que escribas las respuestas para recibir retroalimentación.