Objetivo: comprender el concepto de Objeto, diferenciándolo del de Clase y presentar la notación punto.
Una vez hemos entendido el concepto de Clase en el paradigma de la Programación Orientada a Objetos, es momento de matizar que es un Objeto en su sentido más práctico.
Una Clase, como hemos visto, no es más que una especificación que define las características y el comportamiento de un determinado tipo de objetos. Piensa en ella como si se tratara de una plantilla, molde o esquema a partir del cual podremos construir objetos concretos.
Consideremos la clase Coche que definimos en el artículo anterior:
class Coche
{
String marca;
String modelo;
String color;
int numeroDePuertas;
int cuentaKilometros;
int velocidad;
boolean arrancado;
void arrancar()
{
arrancado = true;
}
void parar()
{
arrancado = false;
}
void acelerar()
{
velocidad = velocidad + 1;
}
void frenar()
{
velocidad = velocidad - 1;
}
void pitar()
{
System.out.println("Piiiiiiiiiiiiiiiiii");
}
int consultarCuentaKilometros()
{
return cuentaKilometros;
}
}
Con este esquema en nuestras manos, vamos a crear coches concretos de la marca, modelo y color que nos apetezca. Cada uno que creemos será un objeto, o instancia, de la clase Coche. Fíjate, en esta terminología, en la equivalencia de los términos objeto e instancia para referirnos, ahora sí, a entidades concretas de una determinada clase.
Fabriquemos, entonces, nuestro primer coche…
Cada objeto, como todas las variables en Java, ha de ser declarado antes de ser utilizado:
Coche coche1;
Con esta instrucción declaramos la variable coche1 de tipo Coche. En cuanto creemos, con el comando que escribiremos a continuación, el objeto concreto, coche1 contendrá una referencia a ese objeto, es decir, almacenará la dirección de memoria en la que realmente se halla el objeto propiamente dicho. Esto es muy importante: coche1 no contendrá el objeto en sí, sino una dirección de memoria que apunta a él.
Materialicemos nuestro primer coche del siguiente modo:
coche1 = new Coche();
La palabra reservada new se emplea para crear nuevos objetos, instancias de una determinada clase que indicamos a continuación seguida de un par de paréntesis.
Veremos esto a su debido momento, pero por ahora debe bastarte retener que se está invocando a un método especial que tienen todas las clases que sirve para construir el objeto en cuestión facilitándole sus valores iniciales. A este método se le conoce como constructor de la clase.
Podríamos habernos ocupado de la declaración y la creación en una sola instrucción:
Coche coche1 = new Coche();
Otro trasto más contaminando nuestras ciudades. Hagamos, al menos, que no consuma mucho:
coche1.marca = "Seat";
coche1.modelo = "Panda";
Consulta el cuadro de arriba con la definición de la clase y observa que tanto marca como modelo son dos atributos de tipo String, por lo que referencian cadenas de caracteres que escribimos entre comillas.
Observa con cuidado la notación punto. Separamos el nombre de la variable que referencia al objeto del atributo empleando un punto como separador.
Pintemos de azul nuestro flamante vehículo:
coche1.color = "Azul";
Además tiene tres puertas, el cuenta kilómetros indica 250.000 Km (bueno, algo viejo parece que es) y su velocímetro refleja 0 Km/h. Valores correspondientes a los atributos numeroDePuertas, cuentaKilometros y velocidad, respectivamente, todos de tipo entero.
coche1.numeroDePuertas = 3;
coche1.cuentaKilometros = 250000;
coche1.velocidad = 0;
Su motor está detenido, hecho que representamos a través de la variable booleana arrancado:
coche1.arrancado = false;
Cuando nos cansemos de enredar con los atributos podemos jugar con los métodos. Arranquemos el Panda:
coche1.arrancar();
De nuevo, empleamos también la notación punto para separar la variable del método.
Si observas el código verás que este método se limita a hacer que la variable booleana arrancado valga ahora true. Podrías decir que hubiéramos logrado el mismo resultado actuando sobre el atributo directamente, en lugar de invocar al método:
coche1.arrancado = true;
En efecto, es así; pero, como comprenderás más adelante, no suele ser buena idea dejar que los programas campen a sus anchas y modifiquen arbitrariamente los atributos de un objeto, siendo preferible que sean los métodos los que se ocupen de esa labor. Imagina que el programa intenta hacer que el cuenta kilómetros marque una cantidad negativa, o que el número de puertas sea igual a cincuenta. Un método correctamente diseñado podría gestionar que los valores estuvieran dentro del rango adecuado y asegurarse de que se cumplen las condiciones que permitirían la modificación del atributo.
La Programación Orientada a Objetos implementa un mecanismo, denominado encapsulación, que nos permite ocultar determinadas facetas de nuestro objeto y dejar sólo accesibles aquellas partes que nos interesen. Pero vayamos por orden, todo a su momento…
Sigamos jugando con nuestro viejo cacharro azul:
coche1.acelerar();
Lo que provocará, si consultas el código, que el velocímetro incremente en una unidad su valor.
coche1.pitar();
Lo que ocasionará un estridente pitido.
Puedes crear todos los objetos de la clase Coche que desees:
Coche coche2 = new Coche();
Cada uno con su propia colección de atributos:
coche2.marca = "Ford";
coche2.modelo = "Fiesta";
coche2.color = "Negro";
Incluso podrías crear otros Seat Pandas, por supuesto. Aunque, en un instante dado, compartieran los mismos valores en sus atributos, se trataría de objetos distintos, ubicados en direcciones de memoria diferentes y cada uno podría seguir su propia trayectoria vital.
En el próximo artículo aprenderemos a crear un programa que nos permita probar nuestra clase Coche y en el que veremos en acción las líneas de código que hoy hemos esbozado.
Javier Montero Gabarró
El texto de este artículo se encuentra sometido a una licencia Creative Commons del tipo CC-BY-NC-ND (reconocimiento, no comercial, sin obra derivada, 3.0 unported)
El Club del Autodidacta
Índice completo de artículos sobre Java.
muy buen manuel de los concepto
muy bueno, se agreadece la informacion
excelenteeeeeeeeeeeee muchas gracias por el aporte