Foros aprenderaprogramar.com
Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: toni_apr en 12 de Agosto 2014, 22:25
-
Hola
Considera que estás desarrollando un programa Java donde trabajas con la superclase Profesor y la subclase ProfesorEmerito. Crea el código para estas clases que cumpla los requisitos que indicamos.
Como atributos de la superclase tendremos nombre (String), edad (int) y añosConsolidados (int) declarados como protected.
En la subclase se trabajará con el campo adicional añosEmerito declarado como private.
Un método de la subclase será double obtenerSalarioBase () que obtendrá el salario base como (925 + añosConsolidados * 33.25 + 47.80 * añosEmerito).
Intenta acceder directamente al campo añosConsolidados desde la subclase (como si fuera un campo más de la subclase) para implementar este método. ¿Es posible sin utilizar una invocación a super ni un método get? ¿Qué ocurre si el atributo en la superclase lo declaras private?
Clase Profesor
/**
* Detalles de la clase.
* @author (Toni)
* @version (0)
*/
public class Profesor { // Atributos de la clase Profesor
protected String nombre;
protected int edad;
protected int añosConsolidados;
//Constructor para objetos de la clase Profesor
public Profesor(String nombre,int edad,int añosConsolidados) { // Inicializa atributos
this.nombre = nombre;
this.edad = edad;
this.añosConsolidados = añosConsolidados;
} // Fin del constructor Profesor
// Siguen los setters para los atributos de la clase Profesor
public void setNombre (String nombre) { this.nombre = nombre; }
public void setEdad (int edad) { this.edad = edad; }
public void setAñosConsolidados (int añosConsolidados) { this.añosConsolidados = añosConsolidados; }
// Ahora los getters para los atributos de la clase Profesor
public String getNombre () { return nombre; }
public int getEdad () { return edad; }
public int getAñosConsolidados () { return añosConsolidados; }
// Y seguidamente, metodos varios.
} // Fin de la clase Profesor
Clase ProfesorEmerito
/**
* Detalles de la clase.
* @author (Toni)
* @version (0)
*/
public class ProfesorEmerito extends Profesor { // Atributos de la clase ProfesorEmerito
private int añosEmerito;
//Constructor para objetos de la clase ProfesorEmerito
public ProfesorEmerito(String nombre,int edad,int añosConsolidados, int añosEmerito) { // Inicializa atributos
super(nombre, edad, añosConsolidados);
this.añosEmerito = añosEmerito;
} // Fin del constructor ProfesorEmerito
// Siguen los setters para los atributos de la clase ProfesorEmerito
public void setAñosEmerito (int añosEmerito) { this.añosEmerito = añosEmerito; }
// Ahora los getters para los atributos de la clase ProfesorEmerito
public int getAñosEmerito () { return añosEmerito; }
// Y seguidamente, metodos varios.
public double obtenerSalarioBase() { return 925 + super.añosConsolidados * 33.25d + 47.80d * añosEmerito; }
} // Fin de la clase ProfesorEmerito
En la clase ProfesorEmerito, podemos acceder al atributo 'añosConsolidados' de la clase Profesor como si fuera uno propio, debido a que se declaró como 'protected'.
Este modificador se utiliza para que la subclase acceda al atributo de la superclase de la misma forma que accede a sus propios atributos.
Si este atributo se hubiera declarado 'private', para acceder a él desde la subclase, solo se podría hacer con el método 'getAñosConsolidados ()'
Clase Test
/**
* Detalles de la clase.
* @author (Toni)
* @version (0)
*/
public class Test {
public static void main (String [] args) {
ProfesorEmerito pe = new ProfesorEmerito("Eduardo",33,10,5);
System.out.println("Salario base: " + pe.obtenerSalarioBase());
} // fin del main
} // Fin de la clase Test
-
Hola toni, respuestas y código las veo correctas.
A la pregunta: ¿Es posible sin utilizar una invocación a super ni un método get?
Podríamos responder con que es tanto válido:
{ return 925 + super.añosConsolidados * 33.25d + 47.80d * añosEmerito; }
Como:
{ return 925 + añosConsolidados * 33.25d + 47.80d * añosEmerito; }
Esto siempre que añosConsolidados esté declarada como protected, si se declara private no es posible el acceso de una forma ni de otra, ya que aparecería el mensaje de error "añosConsolidados has private access in Profesor"
Saludos
-
Gracias Alex por revisar mi ejercicio.
En cuanto al uso de la palabra clave 'super', estoy acostumbrándome a usarla.
Todavía no la tengo interiorizada, espero superar eso a fuerza de utilizarla.
Saludos