Diario de un Aprendiz de Java

Thursday, May 19, 2005

Clases, métodos y objetos

Para todos aquellos que nos iniciamos en el mundo de la programación orientada a objetos y en especial en el mundo de Java, hay tres vocablos técnicos que oimos hasta la saciedad en los manuales, tutoriales y cursos, pero que tanto para quien empiezan en el mundo de la programación como para aquellos que vienen del paradigma de la programación estructurada son un tanto dificiles de entender; las clases, objetos y métodos. Por esto intentaré explicar por encima "quien es quien" en el mundo de la POO, y como podemos implementarlo en Java, ya que son la espina dorsal de este lenguaje de programación.
Una clase es un conjunto de primitivos y métodos relacionados entre si. Ya expliqué lo que eran los primitivos,
ahora le toca a los métodos. Un método es parecido a lo que, en programación estructurada se llama función. Es decir, un fragmento de codigo al que se llama, acompañado de unos datos de entrada, y produce una determinada salida. Para esto tenemos que indicar el tipo de los primitivos de entrada, el tipo de los de salida, el nombre del método y el trabajo que realizara.
[tipoPrimitivoSalida] [nombreMétodo] ([tipoPrimitivoEntrada] [nombrePrimitivoEntrada]) {
 //Codigo del método
  return primitivoSalida;
}

Para ser más explicitos, vamos a poner un ejemplo porque no creo que me haya explicado demasiado bien. Imagina que queremos hacer un método al que le pasamos un parametro determinado (un primitivo tipo int) y devuelva el resultado del primitivo de entrada más 5. Primero definimos el tipo del primitivo de entrada y el de salida (en nuestro caso ambos seran tipo int). Seguidamente, le damos un nombre (en este caso lo he bautizado como sumaCinco) y lo escribimos :
int sumaCinco(int entrada) {
  return entrada + 5;
}

Para usar este método, podemos hacer lo siguiente
int numero;
numero = sumaCinco(10);
System.out.println("El resultado es " + numero + ".");

Como podeis imaginar, el resultado es, efectivamente, 5.
Un detalle importante que me he olvidado comentar es el tema de los modificadores. No entraré demasiado en detalle con esto, pero debemos saber que para usar un método desde otro método tipo static (como el método main, que se declara como public static void main(String[] args)). Otro tipo de modificador es el public, que permite que el método sea usado desde otro paquete. Pero como en nuestros pequeños programas aún no usamos paquetes, lo dejaremos para otro dia. Para terminar con esto, una cosa muy importante, debo decir que los modificadores se especifican justo antes de poner el tipo del primitivo de salida. Completando el esquema de un método estandar que había empezado antes, nos queda esto
[modificadores] [tipoPrimitivoSalida] [nombreMétodo] ([tipoPrimitivoEntrada] [nombrePrimitivoEntrada]) {
  //Codigo del método
  return primitivoSalida;
}


Ahora que ya sabemos lo que son los primitivos y los métodos, podemos crear una clase. Como he dicho al principio, una clase es un conjunto de primitivos y métodos, así que también podemos hacer un esquemilla de como sería una clase estandar
class NombreClase {
  //Primitivos

  //Métodos
}

Así como los nombres de los primitivos empiezan con una minúscula por convención, los nombres de clases empiezan con una mayúscula por el mismo motivo.
Para dejarlo claro, hagamos un ejemplo. Queremos crear una clase que nos permita "simular" un disco de música. Los parametros que definen un disco son su título, el nombre del grupo que lo edita, el estilo de música de sus canciones, el número de canciones, el nombre de la productora, y demás. Estos serían los primitivos de la clase. ¿Y que pasa con los métodos? Pues en nuestra clase DiscoMusica podrían ser métodos que especificaran estos valores (los primitivos) para cada cd de nuestra coleccion. Un método llamado definirEstilo, al que le pasasemos un string con el nombre del estilo de música, y un método para definir cada primitivo. Para ponernos lo sencillo y no complicarnos con el uso de strings o arrays, solo trabajaremos con enteros, y simplificaremos mucho la clase. También pondré un método que nos devuelva el número de componentes del grupo, mediante un returnEl codigo sería asi
class DiscoMusica {
  int numeroCanciones;
  int numeroComponentesGrupo;
  int añoPublicacion;

  void definirNumeroCanciones(int numero) {
   numeroCanciones = numero;
  }

  void definirNumeroComponentes(int num) {
   numeroComponentesGrupo = num;
  }

  void definirAño(int año) {
   añoPublicacion = año;
  }

  int devolverNumeroComponentes() {
   return numeroComponentesGrupo;
  }
}

¡Hecho, una clase que pseudo define un disco! Tenemos primero los tres primitivos, y luego sus métodos que los definen. Muy bien, pero esto define un disco genérico. Imaginemos que queremos hacer una clasificacion de 3 discos, ¿tengo que hacer una clase diferente para cada uno de ellos? ¡Pues claro que no, porque aqui entran en juego los famosos objetos! Un objeto no es más que una personalificación de una clase, el conjunto de primitivos y métodos definidos en la clase, que ahora definen un objeto determinado (por ejemplo, disco1, disco2, disco3 ...). Para definir un objeto, debemos especificar en que clase se basará, con la siguiente sintaxis
[nombreClase] [nombreObjeto] = new [nombreClase]();
Por ejemplo, para crear un objeto llamado disco1 basado en la clase que creamos anteriormente, hacemos
DiscoMusica disco1 = new DiscoMusica();
Ahora que ya tenemos el objeto disco1, podemos asignar un valor a sus primitivos. Podemos usar los métodos del objeto disco1 que hemos creado usando la clase DiscoMusica (como veis, en esta frase se resumen los 3 conceptos que quiero dejar claros) usando el nombre del objeto junto con el nombre del método a usar, separados por un punto entre ellos
[nombreObjeto].[nombreMétodo]([primitivosEntrada]);
En nuestro caso, vamos a especificar el número de componentes, canciones y el año publicación del disco1
disco1.definirNumeroCanciones(14);
disco1.definirNumeroComponentes(3);
disco1.definirAño(2005);

También podemos usar el método que nos devuelve el numero de componentes del objeto disco1
System.out.println("Hay " + disco1.devolverNumeroComponentes() + " músicos.");
Con esto imprimimos por pantalla la cadena "Hay ", concatenada (el operador + suma numeros, pero también sirve para unir dos o más cadenas) con el resultado de disco1.devolverNumeroComponentes(), y también lo concatena con la cadena " músicos.". El resultado es Hay 3 músicos., que es imprimido por pantalla.

Si has llegado aqui, espero que te haya quedado claro todo lo explicado aqui. Ahora mismo publico el codigo fuente de la explicación, totalmente funcional, en otra entrada. ¡Saludos!

17 Comments:

Post a Comment

<< Home