Saltar a contenido

Objetos

Se les llama instancias de clase, son un elemento en sí de la clase. Un objeto se crea utilizando el llamado constructor de la clase. El constructor es el método que permite iniciar el objeto. El objeto se representa mediante una variable. Esta variable contiene la dirección de memoria del objeto.

Al contrario de lo que sucede en otros lenguajes como C/C++, en el lenguaje Java no se trabaja con punteros que podamos ver y manejar, pero debemos saber que todas las referencias a un objeto son, de hecho, punteros, es decir, son variables que contienen la dirección de memoria del objeto que representan.

Datos (propiedades o atributos)

Para poder acceder a los atributos de un objeto, se utiliza esta sintaxis:

objeto.atributo;

Los atributos toman el valor inicial por defecto:

  • 0 para tipos numéricos.
  • '\0' para el tipo char.
  • null para String y resto de referencias a objetos.

También se les puede asignar un valor inicial en la declaración, aunque lo normal es hacerlo en el constructor. El valor de los atributos en cada momento determina el estado del objeto.

Métodos

Los métodos se utilizan de la misma forma que los atributos, excepto porque los métodos poseen siempre paréntesis, dentro de los cuales pueden ir valores necesarios para la ejecución del método (parámetros).

Una clase puede contener cero o más métodos. Definen el comportamiento de los objetos de la clase. A través de los métodos se accede a los datos de la clase. Desde el punto de vista de la POO el conjunto de métodos de la clase se corresponde con el conjunto de mensajes a los que los objetos de esa clase pueden responder.

Al conjunto de métodos de una clase se le llama interfaz de la clase. Es conveniente que todas las clases implementen los métodos de acceso o métodos setters/getters para cada atributo. El concepto de interfaz se desarrollará en profundidad en temas futuros, pero es interesante que se vaya conociendo lo qué es.

Creación de objetos de una clase

Una vez definida la clase, se pueden utilizar objetos de la clase. Normalmente consta de dos pasos. Su declaración y su creación (instanciación).

Declaración de un objeto

La declaración consiste en indicar que se va a utilizar un objeto de una clase determinada, y se hace igual que cuando se declara una variable simple o de tipo primitivo, es decir, se crea la referencia al objeto.

Vehiculo patinete;

Esto declara el objeto patinete como objeto de tipo Vehiculo; se supone que previamente se ha definido la clase Vehiculo. La referencia tiene como misión almacenar la dirección de memoria del objeto. En este momento la referencia patinete almacena una dirección de memoria nula (null).

Instanciación de un objeto

Mediante la instanciación o definición de un objeto se reserva un bloque de memoria para almacenar todos los atributos del objeto. Al instanciar un objeto solo se reserva memoria para sus atributos. No se guardan los métodos para cada objeto, pues son los mismos y los comparten todos los objetos de la clase. Se emplea el operador new. Mediante este operador se asigna la memoria necesaria para ubicar el objeto y devuelve la dirección de memoria donde empieza el bloque asignado al objeto.

patinete = new Vehiculo ();

Al hacer esta operación el objeto reserva la memoria que necesita y se inicializa el objeto mediante su constructor. Más adelante veremos cómo definir el constructor. De este modo ya tenemos todo lo necesario para poder trabajar con nuestro objeto y poder realizar todo lo que nuestro programa necesita.

Especificadores de acceso

Como hemos visto antes, el concepto de clase incluye la idea de ocultación de datos, que básicamente consiste en que no se puede acceder a los datos directamente (zona privada), sino que hay que hacerlo a través de los métodos de la clase. De esta forma se consiguen dos objetivos importantes:

  • Que el usuario no tenga acceso directo a la estructura interna de la clase, para no poder generar código basado en la estructura de los datos.
  • Si en un momento dado alteramos la estructura de la clase todo el código del usuario no tendrá que ser retocado.

El especificador o modificador de acceso es una palabra que antecede a la declaración de una clase, método o propiedad de clase. Se utiliza para definir el nivel de ocultación o visibilidad de los miembros de la clase (atributos y métodos) y de la propia clase. Hay tres posibilidades: public, protected y private. Una cuarta posibilidad es no utilizar ninguna de estas tres palabras; entonces se dice que se ha utilizado el modificador por defecto (package-private).

Los especificadores determinan el alcance de la visibilidad del elemento al que se refieren. Referidos por ejemplo a un método, pueden hacer que el método sea visible solo para la clase que lo utiliza (private), para esta y las heredadas (protected), para todas las clases del mismo paquete (sin modificador o package-private) o para cualquier clase del tipo que sea (public).

La utilización del modificador private sirve para implementar una de las características de la programación orientada a objetos: el ocultamiento de la información o encapsulación. La declaración como público de un atributo de una clase no respeta este principio de ocultación de información. Declarándolos como privados, no se tiene acceso directo a los atributos del objeto fuera del código de la clase correspondiente y solo puede accederse a ellos de forma indirecta a través de los métodos proporcionados por la propia clase.

Pirata p = new Pirata();
// con modificador privado
p.setEdad(20);
p.setNombre(Luffy);
// con modificador public
p.banda=Piratas Sombrero de Paja;
// errores frecuentes
p.edad=20;

// El compilador nos avisará del error ya que intentamos acceder de forma directa a un atributo privado.

Una de las ventajas prácticas de obligar al empleo de un método para modificar el valor de un atributo es asegurar la consistencia de la operación, es decir, siempre tendremos un control directo sobre los diferentes estados o valores de los atributos del objeto.