Retroalimentación
Identificando actores / objetos involucrados
De acuerdo a lo solicitado en el enunciado, es posible plantear el problema haciendo uso de tres actores (profesor, estudiante, ordenador). Para cada uno de ellos se desarrollará una clase Java.
Se crearán cinco ficheros de código fuente, que una vez compilados nos proporcionarán otros tantos ficheros en código intermedio (bytecode de Java).
Para la ejecución del programa, el intérprete de Java hará uso de los ficheros bytecode creados, junto a otras funciones pertenecientes a las bibliotecas de Java.
Cuando queremos implementar una solución, se crea un “proyecto”, cuyos contenidos quedan almacenados en el sistema de archivos del ordenador en un directorio (semaforo en nuestro caso).
A partir de aquí, se pueden ver subdirectorios, que organizan los diferentes archivos del proyecto en paquetes (paquetes clases y principal para este ejemplo).
Por último, cada paquete puede contener un conjunto de ficheros, donde se implementan las clases. Podrá ser una o varias por fichero (típicamente fichero .java implementa una clase).
Ejemplo de visualización de ficheros en Linux:

Descripción de las clases
Clase ClaseColor (ClaseColor.java)
package principal;
import clases.Profesor;
// Clase color, el profesor pregunta a un alumno por un color entre (rojo, amarillo y verde)
public class ClaseColor {
public static void main(String[] args) {
Profesor teacher = new Profesor();
String color = teacher.preguntacolor();
System.out.println("La respuesta recibida es:" + color);
}
}
Consideraciones de la clase ClaseColor:
- La clase ClaseColor está contenida en el fichero ClaseColor.java y se incluye en un paquete llamado principal (1).
- Como parte del código de la clase, se va a utilizar la clase Profesor que forma parte del paquete clases (2).
- El inicio del programa se lleva a cabo en esta clase, puesto que incluye la función main (5).
- De la clase Profesor se crea un objeto llamado teacher (6).
- Desde la clase ClaseColor se envía un evento a la clase Profesor (a través del objeto teacher), para que esta última ejecute el método preguntacolor (7).
- También utilizamos funciones proporcionadas en las librerías de Java, como println .
Clase Ordenador (Ordenador.java)
package clases;
import java.util.Random;
public class Ordenador {
public Ordenador() {}
public String color(){
Random randomGenerator = new Random();
int randomInt = randomGenerator.nextInt(3);
if(randomInt == 0)
{ return "rojo";}
else if(randomInt == 1)
{ return "amarillo";}
else
{ return "verde";}
}
}
Consideraciones de la clase ordenador:
- La clase Ordenador utiliza el método Random para obtener un número aleatorio entre 0 y 2.
- El método color devuelve una de las siguientes cadenas de caracteres (“rojo”, “amarillo”, “verde”), instrucción return (9, 11, 13).
Clase Persona (Persona.java)
package clases;
// Clase utilizada para ser herencia de estudiante y profesor
public class Persona {
// Métodos de clase. Edad y nombre
int i_Edad;
String s_Nombre;
}
Consideraciones de la clase persona:
- La clase Persona no va a ser instanciada directamente en el programa (crear un objeto de la clase). Se trata de una clase padre, que va a ser utilizada por las clases estudiante y profesor para heredar sus características.
- En esta clase se definen las variables de clase int i_Edad y s_Nombre (5, 6).
Clase Estudiante (Estudiante.java)
package clases;
public class Estudiante extends Persona{
// Incluye un método de clase que se une a los heredados
int i_Curso;
public Estudiante() {
i_Edad=25;
s_Nombre = "Luis";
i_Curso = 1;
}
public void presentarse(){
System.out.println("Soy " + s_Nombre + " Alumno de " + Integer.toString(i_Curso) + " y tengo una edad de: " + Integer.toString(i_Edad));
}
public String preguntacolor(){
presentarse();
Ordenador mipc = new Ordenador();
return mipc.color();
}
}
Consideraciones de la clase Estudiante:
- Esta clase hereda de la clase Persona, claúsula extends (2).
- En la clase estudiante se pueden utilizar las propiedades y métodos definidos en la clase padre (6, 7, 11).
- Además puede incluir otros métodos y propiedades propias (4).
- Si hubiéramos sobrescrito una de las propiedades o métodos del padre, en la propia clase, ésta utilizaría sus propios métodos y propiedades en lugar de los heredados.
Clase Profesor (Profesor.java)
package clases;
public class Profesor extends Persona{
Public Profesor() {} // Constructor
// Hace la pregunta al estudiante sobre el color
Public String preguntacolor(){
Estudiante alumno = new Estudiante();
String colorRec = alumno.preguntacolor();;
return colorRec;
}
}
Uso del traductor/compilador de Java
Como se indicaba anteriormente, cuando se crea un nuevo proyecto Java todos sus recursos “cuelgan” de un determinado directorio en el sistema de archivos ("/home/debian/Escritorio/semaforo" en este ejemplo). Puedes elegir el que quieras en tu equipo.
A partir de aquí, podemos ir distribuyendo los ficheros en diferentes paquetes, que corresponderán a subdirectorios del directorio proyecto ("/home/debian/Escritorio/semaforo"). Así hemos incluido los ficheros Ordenador.java, Persona.java, Profesor.java y Estudiante.java en el paquete clases. Además de distribuir los paquetes en el directorio correspondiente, es necesario indicarlo en el código (ver instrucción package).
Para utilizar cada una de estas clases en otros ficheros .java deberemos importarlos (instrucción import). Si dos ficheros forman parte del mismo paquete, no es necesario que sean importados.

El fichero de inicio del programa ClaseColor.java (incluye la función main), y forma parte del paquete principal.
Para obtener el código bytecode del fichero clasecolor.java:
- Acceder al directorio de inicio del proyecto desde un terminal.
- Llamar al compilador (traductor) de Java "javac" indicando la ruta relativa del fichero que queremos compilar. En nuestro caso “javac principal/ClaseColor.java”.
- Como resultado obtenemos el fichero interpretable por Java ClaseColor.class.
Puedes ver el proceso en la siguiente imagen (ejemplo en Linux).

Para que el compilador funcione tal y como se ha descrito en este punto, será necesario que se hayan metido las variables de entorno tal y como se ha indicado la práctica anterior.
Nota: la compilación del fichero principal "javac principal/ClaseColor.java" puede ya compilar todos los ficheros del proyecto al ser unos dependientes de otros. En caso contrario, compilaremos el resto uno a uno en el siguiente orden: Persona.java, Ordenador.java, Estudiante.java, Profesor.java y ClaseColor.java.
Una vez disponibles todos los ficheros bytecode, procedemos a la ejecución del programa desde un terminal, vamos al directorio de inicio del proyecto y ejecutamos el intérprete java: “java principal/ClaseColor”.

Empaquetar .class en fichero .jar
Java nos permite empaquetar todos los ficheros (.class, junto a otros recursos utilizados) del proyecto en uno único con extensión .jar (Java ARchives). Además el formato del fichero .jar es comprimido, por lo que ocupa menos espacio que la información original.
A continuación se indica el procedimiento para llevarlo a cabo.
Crear el fichero MANIFEST.MF
Crear un directorio META-INF (¡las mayúsculas son importantes!) y dentro un fichero MANIFEST.MF. Este fichero indica, entre otras cosas, cuál será la clase principal. A menudo el fichero MANIFEST.MF contiene una única línea:
Main-Class: principal.ClaseColor
donde se indica que ClaseColor.class (del paquete principal) es la clase que contiene el método main.
Nota : el fichero
MANIFEST.MF se puede crear con cualquier editor de texto. Hay que introducir un fin de línea (enter) tras la última línea con texto.
Crear el fichero semaforo.jar
El paquete JDK proporciona una serie de ejecutables. Ya se ha trabajado con algunos de ellos como el compilador de java (javac) y con el intérprete (java) en prácticas anteriores. Otro de los programas a nuestra disposición es jar, que permite empatequetar todos los recursos de un proyectos Java en un fichero con extensión .jar.
Desde consola del sistema, ejecutar el programa jar con los siguientes parámetros:
jar cmf META-INF/MANIFEST.MF semaforo.jar clases/*.class principal/*.class

Observa en la imagen una ejecución del proyecto utilizando el fichero .jar obtenido:
El programa jar también nos permite ver el contenido de proyecto comprimidos .jar:
jar tf semaforo.jar


Si deseamos descomprimir la información del fichero .jar, para obtener sus fichero originales:
jar xf semaforo.jar


Script Compilar.sh
Para facilitar la creación de nuestros ficheros interpretables, es útil crear un script que realice todo el proceso de una sola vez. En nuestro proyecto podría ser compilar.sh, al que se deberá dar permisos de ejecución.
En el módulo de sistemas informáticos se estudia como crear scripts. Se puede dejar este ejercicio para cuando se haya visto como crear scripts en dicho módulo.
Ejemplo en Linux:

