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