TEMAS ESPECIALES DE COMPUTACIÓN                 LABORATORIO NÚMERO 3                                 26/JUNIO/2001

NOMBRE: _____________________________________________________________.

 

1.        Se tiene el siguiente enunciado para el desarrollo de un sistema: “... En esta empresa laboran alrededor de 100 empleados y se registra su nombre y salario de cada uno de ellos. De todos los empleados de un departamento, sólo uno es el gerente y los demás son subordinados de él...”

 

Para representar lo anterior en clases de Java, ¿Cuál clase sería hija de la otra (Clase Empleado hija de Clase Gerente o Clase Gerente hija de Clase Empleado)?________________________________________________________________.

 

2.        Si se le pide escribir la siguiente clase en su propio archivo,

¿Cómo se llamará ese archivo? _______________________________. Escriba el código, guárdelo y compílelo.

 


1: public class Empleado

2: {

3:  String nombre = null;

4:  float salario = 0.0f;

5:  String titulo = "Empleado";

6:

7:  public Empleado(String nom, float sal)

8:  {

9:   nombre = nom;

10:   salario = sal;

11:  }

12:

13:  public void identificaEmpleado()

14:  {

15:   System.out.println("Iniciando el metodo identificaEmpleado de Empleado");

16:   System.out.println("Mi nombre es " + this.nombre + ", soy " + this.titulo + " y gano:

        $" + this.salario);

17:  }

18:

19:  public static void main(String arg[])

20:  {

21:   Empleado emp1 = new Empleado("Juan Alvarez",9500.50f);

22:   emp1.identificaEmpleado();

23:   System.out.println("Mi puesto es: " + emp1.titulo);

24:  }

25: }

 

Como se observa, la variable de instancia llamada titulo se inició con el valor “Empleado” y esta variable se imprime dentro del método de instancia identificaEmpleado() así como también dentro del método de clase main(String arg[]).

Ejecute la clase Empleado y escriba aquí la salida:

 

3.        Si se le pide escribir la siguiente clase en su propio archivo,

¿Cómo se llamará ese archivo? _______________________________. Escriba el código, guárdelo y compílelo.

 

1: public class Gerente extends Empleado

2: {

3:  String depto = null;

4:  String titulo = "Gerente";

5:

6:  public Gerente(String nom, float sal, String dep)

7:  {

8:   super(nom, sal);

9:   depto = dep;

10:  }

11:

12:  public void identificaEmpleado()

13:  {

14:   System.out.println("Iniciando el metodo identificaEmpleado de Gerente");

15:   System.out.println("Mi nombre es " + this.nombre + ", soy " + this.titulo + " y gano:

       $" + this.salario);

16:  }

17:

18:  public static void main(String a[])

19:  {

20:   Empleado emp2 = new Empleado("Mauricio Martinez",9500.50f);

21:   Empleado emp3 = new Gerente("Miguel Lopez",9500.50f,"Sistemas");

22:   Gerente emp4 = new Gerente("Jose Perez",18750.00f,"Sistemas");

23:   emp2.identificaEmpleado();

24:   System.out.println("Mi puesto es: " + emp2.titulo);

25:   emp3.identificaEmpleado();

26:   System.out.println("Mi puesto es: " + emp3.titulo);

27:   emp4.identificaEmpleado();

28:   System.out.println("Mi puesto es: " + emp4.titulo);

29:  }

30: }

 

Como se observa, la variable de instancia llamada titulo se inició con el valor “Gerente” y esta variable se imprime dentro del método de instancia identificaEmpleado() así como también dentro del método de clase main(String a[]).

Ejecute la clase Gerente y escriba aquí la salida:

 

En la siguiente sentencia: Empleado emp2 = new Empleado("Mauricio Martinez",9500.50f);

La palabra Empleado que está a la izquierda de emp2 es en realidad el tipo declarado de la referencia. ¿De cuál referencia? de emp2 ya que como lo dijimos anteriormente, emp2 es una referencia a objeto (de manera práctica se puede manejar que es un objeto). La palabra Empleado que está a la derecha (o sea, el nombre del constructor) es el tipo real del objeto. Ahora viene la conclusión de este ejercicio:

 

Cuando se invoca un método sobre un objeto, el tipo real del objeto es el que rige qué implementación del método se usa. Cuando se accede a un campo o variable se usa el tipo declarado de la referencia.

 

Por lo tanto para emp2 el método identificaEmpleado() se invoca a partir del tipo real (el constructor) que es Empleado y se ejecuta el método identificaEmpleado de la clase Empleado. Después se imprime la variable emp2.titulo y como el tipo declarado de la referencia para emp2 es Empleado también, entonces se va a accesar a la variable titulo de Empleado.

 

Algo importante de observar es que el método identificaEmpleado() imprime el valor de la variable titulo pero como el método se invoca a partir del tipo real del objeto, también la variable contenida dentro del método se invoca a partir del tipo real del objeto mientras que la variable titulo del método main(String a[]) se imprime a partir del tipo declarado de la referencia.

 

En la sentencia Empleado emp3 = new Gerente("Miguel Lopez",9500.50f,"Sistemas");

Para emp3 el tipo real del objeto es Gerente y el tipo declarado de la referencia es Empleado.  Por lo tanto se invoca al método identificaEmpleado de la clase Gerente y la variable titulo contenida en ese método también se invoca a partir del tipo real del objeto (que es Gerente) e imprime el valor “Gerente”. En la línea 26 emp3 imprime su variable titulo (otra vez) y ahí se rige por el tipo declarado de la referencia (que es Empleado) e imprime el valor “Empleado”.

 

Para emp4 Gerente es tanto su tipo declarado como su tipo real por lo que el método identificaEmpleado() se invoca a partir de la clase Gerente y la variable titulo contenida en ese método también se invoca a partir del tipo real, que es Gerente. Después en la linea 28, emp4 imprime otra vez su variable titulo pero aquí es a partir del tipo declarado que es Gerente e imprime el valor “Gerente”.