Hola. Dejo el Ejercicio CU00693B del manual pdf Java desde Cero. public, private y protected Java.Tipos de modificadores de acceso. Visibilidad en clases, subclases.
EJERCICIO
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?
¿Es posible sin utilizar una invocación a super ni un método get?Si. Con protected se puede acceder desde todas las clases que estén dentro del mismo paquete.
¿Qué ocurre si el atributo en la superclase lo declaras private?Da un error cuando vas a compilar
"añosConsolidados has private access in Profesor" por que al declarar un campo, variable, etc. como private solo se puede acceder desde dentro de la clase donde se declara.
Clase Profesorpublic class Profesor
{
// instance variables -
protected String nombre;
protected int edad;
protected int añosConsolidados;
/**
* Constructores
*/
public Profesor ()
{
// initialise instance variables
nombre="";
edad=0;
añosConsolidados=0;
}
//Constructor sobrecargado
public Profesor (String nombre,int edad,int añosConsolidados)
{
// initialise instance variables
this.nombre=nombre;
this.edad=edad;
this.añosConsolidados=añosConsolidados;
}
//metodos get
public String getNombre() {
return nombre;
}
public int getEdad() {
return edad;
}
public int getAñosConsolidados() {
return añosConsolidados;
}
//metodos set
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;
}
public double obtenerSalarioBase(){
double salarioBase;
salarioBase=925+añosConsolidados*33.25;
return salarioBase;
}
}
Clase ProfesorEmeritopublic class ProfesorEmerito extends Profesor
{
// instance variables -
private int añosEmeritos;
/**
* Constructores
*/
//Constructor sobrecargado
public ProfesorEmerito(String nombre,int edad,int añosConsolidados,int añosEmeritos)
{
super(nombre,edad,añosConsolidados);
this.añosEmeritos=añosEmeritos;
}
public int getAñosEmeritos() {
return añosEmeritos;
}
//metodos set
public void setAñosEmeritos(int añosEmeritos) {
this. añosEmeritos = añosEmeritos;
}
public double obtenerSalarioBase(){
double salarioBase=( salarioBase=925+añosConsolidados*33.25+(47.80 * añosEmeritos));
return salarioBase;
}
}
Clase TestProtectedpublic class TestProtected
{
public static void main(String[] args){
ProfesorEmerito profeEmerito= new ProfesorEmerito("Jose Marquez de Vicente",45,15,10);
double salarioBaseCalculado=profeEmerito.obtenerSalarioBase();
System.out.print("El salario Base Calculado del Profesor es de :"+salarioBaseCalculado+" Euros");
}
}
Gracias.