Foros aprenderaprogramar.com

Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: Notanumber en 12 de Abril 2014, 21:24

Título: declaracion de atributos y acceso desde subclases java
Publicado por: Notanumber en 12 de Abril 2014, 21:24
Buenas, al declarar private un atributo de una clase, sus subclases no pueden usar dichos atributos? porque en general estos atributos son privados, pero la subclase puede cambiarlos igualmente, ejemplo:

//Código de la clase Persona ejemplo aprenderaprogramar.com
public class Persona {
private String nombre; private String apellidos; private int edad;
public Persona() { nombre = ""; apellidos = ""; edad = 0; }
public Persona (String nombre, String apellidos, int edad) {
this.nombre = nombre; this.apellidos = apellidos; this.edad = edad; }
public String getNombre() { return nombre; }
public String getApellidos () { return apellidos; }
public int getEdad() { return edad; }
} //Cierre de la clase


public class Profesor extends Persona { //Ejemplo aprenderaprogramar.com
private String IdProfesor;
public Profesor () { super();
IdProfesor = "Unknown";}
public Profesor (String nombre, String apellidos, int edad) {
super(nombre, apellidos, edad);
IdProfesor = "Unknown"; }

aqui vemos como public profesor, puede definir nombre apellidos y edad que son atributos private de persona, no entiendo porque esto es posible si han sido declarados private en persona.
Gracias y un saludo
Título: Re: declaración de atributos y acceso desde subclases java
Publicado por: César Krall en 13 de Abril 2014, 21:51
La subclase no puede usar los atributos de su superclase si han sido declarados como private en sus métodos, ya que no puede tener acceso a ellos.

Sin embargo, sí puede simplemente inicializarlos a través del constructor con el fin de que cuando se cree un objeto de la subclase (que tendrá los atributos de la superclase por herencia) no se encuentren vacíos.

Ejemplo: si pones este código en la superclase Persona no tienes problema:

Código: [Seleccionar]
             public void cambiaValorNombreYMuestralo(){
             nombre = "Nombre cambiado";
             System.out.println ("El nombre cambiado es " + nombre);
            }

En cambio si pones ese mismo código en la subclase Profesor te sale un mensaje de error del tipo "nombre has private access in Persona", es decir, que no puedes acceder al atributo de la superclase desde la subclase.

Sin embargo, puedes modificar este comportamiento declarando el atributo como tipo protected en la superclase. Saludos.