Autor Tema: Java diferencia entre private y protected qué permite cada opción super CU00693B  (Leído 2537 veces)

Dimitar Stefanov

  • Experto
  • *****
  • Mensajes: 598
    • Ver Perfil
Buenas. Hago entrega del ejericicio CU00693B del curso Java desde cero.

Citar
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?

Código de la clase "Profesor":

Código: [Seleccionar]
public class Profesor{
    protected String nombre;
    protected int edad;
    protected int anyosConsolidados;
   
    public Profesor(String nombre, int edad, int anyosConsolidados){
        this.nombre = nombre;
        this.edad = edad;
        this.anyosConsolidados = anyosConsolidados;
    }
   
    public Profesor(){
        nombre = "";
        edad = 0;
        anyosConsolidados = 0;
    }
   
    public void setNombre(String nombre){
        this.nombre = nombre;
    }
   
    public void setEdad(int edad){
        this.edad = edad;
    }
   
    public void setAnyosConsolidados(int anyosConsolidados){
        this.anyosConsolidados = anyosConsolidados;
    }
   
    public String getNombre(){return nombre;}
    public int getEdad(){return edad;}
    public int getAnyosConsolidados(){return anyosConsolidados;}
   
    public double obtenerSalarioBase(){
        double salarioBase;
        salarioBase = 725+(anyosConsolidados*33.25);
        return salarioBase;
    }
   
    public void mostrarInfoProfesor(){
        System.out.println("El profesor: "+getNombre()+" de: "+getEdad()+" años tiene: "+getAnyosConsolidados()+" y años consolidados y no tiene años de emérito.\nPor lo tanto le corresponde un salario de: "+obtenerSalarioBase()+" euros.");
    }
   
}

Código de la clase "ProfesorEmerito":

Código: [Seleccionar]
public class ProfesorEmerito extends Profesor{
    private int anyosEmerito;
   
    public ProfesorEmerito(String nombre, int edad, int anyosConsolidados, int anyosEmerito){
        super(nombre, edad, anyosConsolidados);
        this.anyosEmerito = anyosEmerito;
    }
   
    public ProfesorEmerito(){
        super();
        anyosEmerito = 0;
    }
   
    public void setAnyosEmerito(int anyosEmerito){
        this.anyosEmerito = anyosEmerito;
    }
   
    public int getAnyosEmerito(){return anyosEmerito;}
   
    public double obtenerSalarioBase(){
        double salarioBase;
        salarioBase = 925+(anyosConsolidados*33.25)+(47.80*anyosEmerito);
        return salarioBase;
    }
   
    public void mostrarInfoProfesor(){
        System.out.println("El profesor: "+getNombre()+" de: "+getEdad()+" años tiene: "+getAnyosConsolidados()+" años consolidados y "+getAnyosEmerito()+" años de emérito.\nPor lo tanto le corresponde un salario de: "+obtenerSalarioBase()+" euros.");
    }
}

Código de la clase "TestDeclaracionProtected":

Código: [Seleccionar]
public class TestDeclaracionProtected{
    public static void main(String []Args){
        ProfesorEmerito profesorEmerito = new ProfesorEmerito("Juan",65,45,5);
        profesorEmerito.mostrarInfoProfesor();
    }
}

Si en la superclase "Profesor" los campos a los que queremos acceder desde la subclase están declaradas como "protected" podríamos hacerlo como si de un campo propio de la clase "ProfesorEmerito" se tratase.

En caso contrario, si estuvieran declaradas como "private" no podríamos acceder desde las subclases.

Gracias.
« Última modificación: 18 de Marzo 2016, 09:09 por Mario R. Rancel »

Mario R. Rancel

  • Administrador
  • Experto
  • ********
  • APR2.COM
  • Mensajes: 1978
    • Ver Perfil
Buenos días el ejercicio está correcto

Mismos comentarios que en https://www.aprenderaprogramar.com/foros/index.php?topic=4207.0

Nota: si declaras los atributos como private no significa que no puedas acceder a ellos desde la subclase, sino que no podrás acceder directamente. Sí podrás acceder indirectamente por ejemplo invocando el método get correspondiente pero de la superclase

Ejemplo:

salarioBase = 925+(super.getAnyosConsolidados()*33.25)+(47.80*anyosEmerito);

Saludos.

Dimitar Stefanov

  • Experto
  • *****
  • Mensajes: 598
    • Ver Perfil
Hola, Mario.

Gracias por corregirme el ejercicio.

Totalmente de acuerdo. No podemos acceder directamente a los campos de una superclase, pero sí lo podemos hacer de forma indirecta mediante sus métodos "get´s".

Un saludo.

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".