viernes, 26 de agosto de 2016

Capítulo 67. Java: Constructores


Diario de un programador.- Día 166


Constructores


Esto es algo que me ha costado un poco entender, así que trataré de explicarlo de la mejor forma posible, además que en la web hay quienes lo explican de una manera y otros que lo explican de otra manera. De todas esas definiciones hice un resumen y sumado a lo puesto en práctica con net beans, llegué a la siguiente conclusión:

Un constructor, es un tipo especial de método que sirve para inicializar (darle un valor) los atributos (variables). Con esto se evita algún posible error ya que los atributos siempre tendrán un dato válido. En otras palabras, esto sirve para que en vez de crear variables así...

nombre;
edad;

Se creen variables así...

nombre = "";
edad = 0;

O con cualquier dato (que sea válido) que nosotros indiquemos. De hecho, si olvidamos crear un constructor, el compilador en forma interna lo crea por defecto.
Lo que hace el compilador es dar un valor por defecto a los datos de tipo primitivo (boolean, byte, char, short, int, long, float y double) y a los de tipo referencia (String y objetos). Los valores por defecto para los tipos de datos son los siguientes:

boolean = false
char = ""
byte, short, int, long, float, double = 0
String, objetos = Null

La diferencia entre ambos tipos de datos, es que los datos de tipo primitivo solo pueden almacenar un dato a la vez.
Otra cosa a tener en cuenta es que las variables locales no se inicializan de manera predeterminada.


Antes de continuar con los constructores me voy a detener en este asunto un momento. Por ejemplo. Tengo dos clases, una llamada Inicio y otra llamada Metodos


En la clase Metodos, tengo un atributo o variable de instancia sin un valor asignado (private int numero). Además, tengo un método llamado Prueba, el cual imprime el valor de dicho atributo. En la clase Inicio, tengo lo siguiente:


Esta clase tiene un objeto de la clase Metodos a la cual llamé "datos". Entonces, este objeto llama al método "Prueba" de la clase Metodos "datos.Prueba()", con la finalidad de mostrar el contenido de ese método. Al ejecutar este programa, esto es lo que ocurre:


Muestra su valor por defecto, lo cual podría provocar un error inesperado en nuestro programa. Lo mismo ocurre si en vez de poner un dato de tipo primitivo, se pone un dato de tipo por referencia, por ejemplo String


Al ejecutar el programa...


Esto no sucede con las variables locales, cualquier intento de utilizar una variable local que no se haya inicializado provocará un error en la compilación. Por ejemplo, si dejo el atributo anterior dentro de un método, entonces se convertirá en una variable local. Veamos un ejemplo de esto.


Inmediatamente me aparecen las advertencias de que existe un error, por lo tanto no se podrá compilar. Si coloco el cursor sobre la línea 5 que marca el error, me dice cual es el problema y justamente el problema es que la variable no está inicializada.


Para corregir esto, solamente hay que inicializar la variable, además de que ya no se puede acceder directamente a esa variable por ser local, por lo que también se debe modificar la línea número 9


Volviendo a los constructores...

Observar la siguiente clase:


Esta clase tiene dos métodos, el primer método "Nombre" solicita el ingreso de nuestro nombre y luego devuelve lo ingresado en la variable "nombre". El segundo método "Antecedentes", muestra lo ingresado en la variable "nombre". A pesar de que este programa funciona, las buenas prácticas de programación (según lo que leí en la web) indican que siempre se debe crear un constructor, aun si nuestros atributos se van a inicializar con cero o con valor null. Por este motivo, es que a esta clase le vamos a agregar un constructor, el cual quedó de la siguiente manera:


Como se puede apreciar, el método sirvió para inicializar el atributo, en este caso su valor de inicio fueron unas comillas dobles, pudo haber sido null pero yo lo dejé así. Otro aspecto a considerar de los constructores es que su modificador de acceso es "public", tienen el mismo nombre de su clase y no tienen valor de retorno.

Al momento de crear un objeto, es posible agregarle un argumento que puede servir para agregar un nombre para un objeto. Hasta el momento, al crear un objeto utilizando la palabra clave "new", se utilizaba un paréntesis vacío, el cual indicaba que no se agregaban parámetros. Por ejemplo, supongamos que tenemos varios cuadernos para distintas materias. Quizás el ejemplo es algo simple, pero servirá para mostrar esto. Entonces, crearemos un objeto indicando el nombre de la materia de ese cuaderno. Ejemplo:


En este caso el objeto tiene como argumento un texto, pero también podría ser un número o la combinación de ambos. Como este objeto tiene un argumento de tipo String, el constructor obligatoriamente debe recibir como parámetro un String. Veamos la clase Metodos.


Como se puede apreciar, el constructor recibe como argumento un String, que en este caso llamé "materia", este String está relacionado con el argumento del objeto "cuaderno" de la clase Inicio, es decir, si el objeto hubiese tenido un valor de tipo entero, entonces el constructor también debería tener como argumento un entero. Ahora, en la clase Inicio realicé la llamada al método "Cuadernos" de la clase Metodos y finalmente ejecuté el programa. El resultado fue el siguiente:


De esta forma podemos crear distintos objetos para las distintas materias de nuestros cuadernos, sin tener que modificar la clase Metodos.


Esto es todo por ahora, hasta la próxima.

Gustavo J. Cerda Nilo
Abril 2016, Agosto 2016



No hay comentarios:

Publicar un comentario

C++ El apuntador This

El apuntador This En C++, cada objeto tiene acceso a su propia dirección a través de un puntero o apuntador denominado This. Lo...