Llamada al método contructor

Para instanciar (crear) objetos de una determinada clase (estándar de Java, creada por nosotros, o por un tercero) podemos encontrarnos con distintas formas que debemos aplicar. La más habitual de ellas es utilizar la palabra reservada new, siguiendo el siguiente formato:

new NombreDeLaClase()

Esto sería una llamada al método constructor de la clase. Este tipo de llamada nos devuelven una instancia u objeto de dicha clase. Una vez creado el objeto, podemos guardarlo en una variable o utilizarlo dentro de cualquier expresión compatible con la clase del objeto creado.

Para declarar una variable que pueda contener un objeto de una determinada clase se actúa de forma similar a la declaración de las variables habituales, es decir, siguiendo la estructura:

NombreDeLaClase nombreDeLaVariable;

Es muy habitual que a la vez que se declara una variable, se cree un objeto de su misma clase y se le asigne a dicha variable, formando una sentencia completa de la siguiente forma:

NombreDeLaClase nombreDeLaVariable = new NombreDeLaClase();

Para ver todo esto sobre un ejemplo, vamos a utilizar la clase Ficha, cuyo código fuente puedes descargar aquí. En el archivo que se descarga puedes comprobar que contiene una carpeta llamada javadoc que contiene la documentación sobre la clase Ficha en formato web (abre el archivo index.html o Ficha.html).

Con esta clase de ejemplo, podrías crear una serie de objetos de esa clase utilizando el formato comentado anteriormente:

public class EjemploCreaObjetos {
public static void main(String args[]) {
//Ejemplo de declaración de variable y creación de objeto en dos pasos
Ficha ficha1;
ficha1 = new Ficha();
//Ejemplos de declaración de variable y creación de objetos en un paso
Ficha f = new Ficha();
Ficha fichaRoja = new Ficha();
}
}

Compilación de aplicación con varios archivos java

Para poder compilar sin errores una aplicación que formada por varias clases guardadas en más de un archivo .java diferente, debes utilizar el comando de compilación javac con todos los nombres de archivos java que contienen las clases que formen parte de la aplicación.

javac NombreClase1.java NombreClase2.java NombreClase3.java

Por ejemplo, en el caso anterior la compilación se realizaría así (considerando que los dos archivos se encuentran en la misma carpeta):

javac EjemploCreaObjetos.java Ficha.java

La ejecución se realiza llamando al comando java indicando el nombre de la clase que contiene el método main. En el ejemplo se haría:

java EjemploCreaObjetos

Llamada al método constructor con parámetros

Algunas clases ofrecen la posibilidad de crear objetos indicando una serie de valores al método constructor para que sean tomados en cuenta en el momento de instanciar el objeto. Esos valores que se pasan al método contructor reciben el nombre de parámetros y se indican dentro de los paréntesis. De esta forma, la llamada al método constructor de la clase debería seguir el formato:

new NombreDeLaClase(parámetro1, parámetro2, parámetro3)

El número y tipo de dato de los parámetros debe estar indicado en la documentación del método constructor de la clase. En el momento de hacer la llamada al método constructor hay que cumplir el número de parámetros que admite así como sus tipos de dato.

Hay que tener en cuenta que una misma clase puede tener varios métodos constructores, todos ellos con el mismo nombre que la clase, pero variará el número y/o tipo de datos de los parámetros.

En la documentación de la clase de ejemplo Ficha, puedes encontrar dos métodos constructores que vienen declarados de la siguiente manera:

Ficha01

Podemos ver que existe un método constructor sin parámetros y otro con 3 parámetros que deben ser de los siguientes tipos: (char, int, int). Debe mantenerse el orden indicado, y hay que tener en cuenta que los nombres mostrados para los parámetros sólo son indicativos. En el momento de llamar al método constructor se pueden indicar como parámetros tanto valores literales, como variables o cualquier tipo de expresión siempre que se cumpla con el requisito de que debe respetarse el tipo de dato.

Como ejemplo podríamos tener:

int posX=5;
Ficha fichaColocada = new Ficha('@', posX, posX-3);

Observa que el primer parámetro que debía ser un char, se ha indicado con un valor literal. Para el segundo parámetro se ha utilizado como ejempo una variable de tipo int, ya que es el tipo de dato requerido en ese caso. En el tercer parámetro se ha utilizado el resultado de una expresión aritmética que resulta un valor int, como es requerido.

Instanciación de objetos de clases Java

El lenguaje Java dispone de una gran cantidad de clases predefinidas que pueden ser utilizadas libremente por el programador para dar más funcionalidades a sus aplicaciones. Recuerda que la lista de clases disponibles, así como su documentación sobre su uso la puedes encontrar en la API de Java.

La manera en que deben crearse los objetos de dichas clases puede variar de una clase a otra. La forma exacta de instanciar un objeto de una clase Java debe consultarse en la API.

Generalmente se hace de igual manera que la vista anteriormente.

Por ejemplo, podemos crear un objeto de la clase java.util.Random que utiliza Java para crear números aleatorios:

java.util.Random numeroAleatorio = new java.util.Random();

Pero hay clases que no disponen del método constructor de forma pública, sino que ofrecen un método para obtener instancias, como el método getInstance que usan muchas clases Java, sobre todo aquellas afectadas de alguna manera con la localización geográfica. Por ejemplo, la clase java.util.Calendar que permite trabajar con fechas y horas, o la clase java.text.NumberFormat, que permite trabajar con distintos formatos de números, incluyendo en de moneda.

En la API de Java de ese tipo de clases podemos comprobar que los métodos constructores están declarados como protected, por lo que no pueden ser usados por otra clase externa. En la introducción de la documentación también podemos encontrar infromación sobre cómo se debe instanciar los objetos, como indica para la clase Calendar:

Calendar01

Calendar02

La forma de usarlo sería similar, aunque se usa la llamada al método getInstance detrás del nombre de la clase y no se usa la palabra new.

java.util.Calendar fechaActual = java.util.Calendar.getInstance();

Paquetes e import

Las clases de Java están organizadas en paquetes. En la API de Java se puede comprobar esa organización con la sección que se muestra en la parte superior izquierda. Seleccionando un paquete, se muestran en la parte inferior todas las clases contenidas en el paquete elegido.

También se puede saber a qué paquete pertenece una clase observando la parte superior de su documentación.

paquetes

Cada vez que se hace uso de una clase, hay que hacer referencia al paquete en el que se encuentra. Hay que tener en cuenta que el mismo nombre de clase se puede encontrar en distintos paquetes y su funcionamiento será totalmente distinto, por lo que hay que dejar bien claro a qué paquete pertenece la clase con la que queremos trabajar.

Por ejemplo, la clase Random se encuentra en el paquete java.util, por lo que cuando la usemos debemos indicar que es la clase java.util.Random.

La palabra import nos puede ahorrar tener que escribir siempre delante del nombre de una determinada clase el paquete en el que se encuentra. Si indicamos en la parte inicial del código fuente (antes de la declaración de la clase) las clases de Java que se van a utilizar, en el resto del código sólo hay que indicar el nombre de la clase.

Por ejemplo, si la aplicación que estamos desarrollando va a hacer uso de las clases Random y Calendar, podríamos escribir en la parte inicial:

import java.util.Random;
import java.util.Calendar;

Con esto conseguirmos que cada vez que hagamos referencia a una de esas clase, no hay que indicar el paquete en el que se encuentran. Por ejemplo, al instanciar los objetos sólo hay que indicar:

Random numeroAleatorio = new Random();
Calendar fechaActual = Calendar.getInstance();

Incluso se puede utilizar el carácter comodín * que permite importar todas las clases de un determinado paquete. Por ejemplo:

import java.util.*;

Eso evitaría escribir cada uno de los import del paquete java.util.