Java: Un programa para probar las clases

lasecreObjetivo: desarrollar un programa completo en Java que permita poner a prueba las clases que hemos definido en los artículos anteriores.

Hagamos una breve recopilación de lo que llevamos hasta ahora: hemos definido los conceptos de clase y de objeto, pilares sobre los que se edifica la metodología de la programación orientada a objetos. Sabemos que las clases encapsulan atributos, elementos que indican las características de los objetos, y métodos, conjunto de funciones que definen su comportamiento. Aprendimos a crear objetos nuevos con new y mostramos cómo acceder a los atributos y métodos mediante la notación punto.

Definimos varias clases; entre ellas, Persona y Coche. Cada una reside en su propio fichero de código fuente .java y ha sido compilada en su respectivo fichero .class.

Va a entrar en escena una nueva clase que contendrá el programa principal desde el que probaremos la operatividad de las anteriores.

// ProbandoClases.java

public class ProbandoClases
{
  public static void main(String[] args)
  {
    // Aquí introduciremos el código para probar nuestras clases
  }
}

Esta nueva clase la mantendremos en el mismo directorio en el que se encuentran las restantes y en un fichero independiente denominado ProbandoClases.java. El nombre del fichero debe coincidir con el de la clase, teniendo en cuenta, además, que se diferencian las mayúsculas de las minúsculas.

La razón de ubicar el programa y las clases en el mismo directorio no es otra sino para tener acceso a ellas desde el programa principal. En breve, cuando definamos el concepto de paquete , veremos otros modos de definir las clases y agruparlas de un modo más práctico que facilite la reutilización de código entre programas diferentes. Todo a su momento; vayamos concepto a concepto.

Fíjate en el esqueleto del programa principal: es la misma estructura que presentamos en el Hola Mundo. Con lo que ya sabemos sobre las clases podemos aportar algo más de luz.

public class ProbandoClases

Olvídate por el momento del public. Si te das cuenta, el programa en sí mismo también es una clase, caracterizada por la palabra reservada class. Como tal, podrá tener también sus atributos y métodos.

Fíjate ahora en la siguiente línea:

public static void main(String[] args)

Dejemos el public static para otra ocasión. Lo que vemos después no es más sino la definición de un método, denominado main, que acepta una serie de parámetros entre paréntesis (de los que hablaremos a su debido momento), y que no devuelve ningún valor (void).

Todos los programas en Java han de disponer de un método llamado main, definido del mismo modo que en nuestro ejemplo. Es el punto donde comenzará la ejecución del programa.

Si has programado en C esto no te resultará muy sorprendente, pues en ese lenguaje de programación todo comienza en main también. Lo particular de Java, donde prácticamente todo es un objeto, es que main, en sí mismo, está encapsulado dentro de una clase.

Para que nos sirva de referencia y por comodidad, repito aquí el código de las clases Coche y Persona.

// Coche.java

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;
  }
}

// Persona.java

class Persona
{
  char sexo;
  String nombre;
  int edad;
  Coche coche;
  
  void saludar()
  {
    System.out.println("Hola, me llamo " + nombre);
  }
  
  void dormir()
  {
    System.out.println("Zzzzzzzzzzz");
  }
  
  int obtenerEdad()
  {
    return edad;
  }
}

He numerado las líneas del código del programa principal para poder referenciarlas después en la explicación. Obviamente, esa numeración no debe aparecer en el fichero real.

1  public class ProbandoClases
2  {
3    public static void main(String[] args)
4    {
5      // Aquí introduciremos el código para probar nuestras clases
6      
7      Coche coche1 = new Coche();
8      Persona persona1 = new Persona();
9      Persona persona2 = new Persona();
10    
11    
12      coche1.marca = "Seat";
13      coche1.modelo = "Panda";
14      coche1.color = "Beige";
15      coche1.numeroDePuertas = 3;
16      coche1.cuentaKilometros = 215000;
17      coche1.velocidad = 0;
18      coche1.arrancado = false;
19    
20      persona1.sexo = 'F';
21      persona1.nombre = "Marta";
22      persona1.edad = 32;
23      persona1.coche = coche1;
24    
25      persona2.nombre = "Raimundo";
26        
27      System.out.println(coche1.marca);
28      System.out.println(coche1.modelo);
29      System.out.println(coche1.color);
30      System.out.println(coche1.numeroDePuertas);
31      System.out.println(coche1.cuentaKilometros);
32      System.out.println(coche1.velocidad);
33      System.out.println(coche1.arrancado);
34    
35      System.out.println(persona1.sexo);
36      System.out.println(persona1.nombre);
37      System.out.println(persona1.edad);
38      System.out.println(persona1.coche);
39      System.out.println(persona1.coche.marca);
40      System.out.println(persona1.coche.modelo);
41    
42      System.out.println(persona2.sexo);
43      System.out.println(persona2.nombre);
44      System.out.println(persona2.edad);
45      System.out.println(persona2.coche);
46    
47      coche1.arrancar();
48      System.out.println(coche1.arrancado);
49      coche1.acelerar();
50      System.out.println(coche1.velocidad);
51      coche1.acelerar();
52      System.out.println(coche1.velocidad);    
53      coche1.acelerar();
54      System.out.println(coche1.velocidad);    
55      coche1.frenar();
56      System.out.println(coche1.velocidad);    
57      coche1.frenar();
58      System.out.println(coche1.velocidad);    
59      coche1.frenar();
60      System.out.println(coche1.velocidad);
61      coche1.parar();
62      System.out.println(coche1.arrancado);
63      coche1.pitar();
64      coche1.consultarCuentaKilometros();
65    
66      persona1.saludar();
67      persona1.obtenerEdad();
68      persona2.saludar();
69      persona2.obtenerEdad();
70      persona1.dormir();
71      persona2.dormir();  
72    
73    }
74  }

Si no has modificado las clases y ya tienes los respectivos ficheros .class generados, sólo necesitarás compilar el nuevo fichero:

javac ProbandoClases.java

En caso contrario, si tienes que compilar todo, puedes proceder así:

javac *.java

Para ejecutar el programa, basta con invocar la máquina virtual Java facilitando el nombre de la clase que contiene al método main():

java ProbandoClases

Esta es la salida generada, numerada por mí también para seguir mejor la explicación:

1  Seat
2  Panda
3  Beige
4  3
5  215000
6  0
7  false
8  F
9  Marta
10  32
11  Coche@8814e9
12  Seat
13  Panda
14
15  Raimundo
16  0
17  null
18  true
19  1
20  2
21  3
22  2
23  1
24  0
25  false
26  Piiiiiiiiiiiiiiiiii
27  Hola, me llamo Marta
28      32
29  Hola, me llamo Raimundo
30      0
31  Zzzzzzzzzzz
32  Zzzzzzzzzzz

En las líneas 7-9 del programa nos ocupamos de la creación de los tres objetos con los que trabajaremos, un coche y dos personas. Observa cómo, en la misma instrucción, declaramos cada objeto y lo creamos.

Establecemos valores para los atributos de estos objetos en las líneas 12-25. Al contrario de lo que sucede con persona1, a quien le hemos definido todos sus atributos, persona2 sólo recibe valor (por nuestra parte) del nombre.

En 27-45 realizamos una impresión de todos los atributos de los tres objetos. Podemos observarlo en las salidas 1-17. Merece la pena prestar atención a algunos detalles:

En un momento dado (línea 38 del programa) tratamos de imprimir el valor de persona1.coche. Ese atributo, si prestas atención a la definición de la clase, es de tipo Coche, es decir, es un objeto en sí mismo. Por eso la respuesta rara que obtenemos en la impresión (línea 11), que en verdad es algo así como una referencia a la ubicación del objeto. Podemos tratar de profundizar en ese objeto si deseamos conocer sus atributos. Es precisamente lo que hacemos en las líneas 39-40, obteniendo la respuesta 12-13 en la salida. Presta mucha atención a la doble notación punto para preguntar por el atributo de un atributo.

Entre las líneas 42-45 preguntamos por los atributos de persona2, a la que sólo hemos facilitado su nombre. Sin embargo, Java ya ha hecho algo por nosotros.

Cada vez que se construye un nuevo objeto se invoca a un método especial que tienen todas las clases que se denomina el constructor que presentaremos formalmente en otro artículo. Entre sus funciones se encuentra la de inicializar todos los atributos del objeto. El constructor, cuando está definido explícitamente, suele incorporar en forma de argumentos valores con los que inicializar los miembros. La cuestión es que, si no hay una inicialización explícita en ese constructor, Java se ocupará de suministrar valores iniciales por su cuenta. Ese valor dependerá del tipo de variable. Por ejemplo, si es numérico le asignará el valor cero; si es un booleano, false, si es de tipo char, el carácter nulo (línea 14 de la salida, devuelta en blanco, en respuesta a la línea 42 del código) y si es un objeto (categoría entre la que se encuentran las cadenas de caracteres también), le asignará el valor null (línea 17 de la salida, en respuesta a la línea 45 del código), que es un modo que tiene Java de decirnos que es un objeto inexistente o indefinido.

A partir de la línea 47 comenzamos a probar los métodos de los objetos.

Arrancamos coche1, lo que ocasiona, si revisas el código de la clase, que la variable arrancado se establezca en true, hecho que comprobamos por medio de la línea 48, obteniendo la salida 18.

En las líneas siguientes jugamos a acelerar y a frenar el coche. Observa las salidas 19-24, en las que, después de acelerar gradualmente (incrementando en uno la velocidad) frenamos para volver a dejar el coche con velocidad cero.

Detenemos el motor del vehículo (línea 61) y hacemos sonar su claxon (línea 63, salida 26).

En las líneas de código 27-30 pedimos a persona1 y persona2 que se presenten y nos digan su nombre y edad. Observa que el método obtenerEdad() devuelve un valor numérico, al contrario de los restantes, que no retornan nada (void), de modo que para poder saber de qué valor se trata, obtenerEdad() ha de formar parte de una expresión imprimible (líneas 67 y 69).

Yo estoy cansado de tanto escribir y Marta y Raimundo de que haga el tonto con ellos. De modo que todo el mundo a dormir (líneas 70-71, salidas 31-32).

Javier Montero Gabarró


Java: Un programa para probar las clases


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.

6 opiniones en “Java: Un programa para probar las clases”

  1. Hola, te felicito por la claridad de tu exposición. Ahora estoy expectante esperando tu próxima entrega.
    Muy agradecido.
    Leo.

Deja un comentario