Foros aprenderaprogramar.com

Aprender a programar => C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más => Mensaje iniciado por: Dimitar Stefanov en 15 de Marzo 2016, 19:21

Título: Java diferencia entre private y protected qué permite cada opción super CU00693B
Publicado por: Dimitar Stefanov en 15 de Marzo 2016, 19:21
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.
Título: Re:Java diferencia entre private y protected qué permite cada opción super CU00693B
Publicado por: Mario R. Rancel en 18 de Marzo 2016, 09:09
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.
Título: Re:Java diferencia entre private y protected qué permite cada opción super CU00693B
Publicado por: Dimitar Stefanov en 18 de Marzo 2016, 15:00
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.