2011-08-05 14 views
5

Tengo un código:Padres datos de la función miembro de ocultación del niño miembro

class Parent{ 
    int x=10; 
    void show(){ 
     System.out.println(x); 
    } 
} 

class Child extends Parent{ 
    int x=20; 
    public static void main(String[] args){ 
     Child c=new Child(); 
     c.show(); 
    } 
} 

Aquí cuando corro este programa viene la salida es de 10. Lo que significa al miembro de funciones de tiempo de ejecución de Padres no usar la técnica de Niño miembro con el mismo nombre (ocultamiento de datos). Lo que sé es que cada vez que ampliamos una clase, su clase miembro member-function y data-members están disponibles para la clase Child, luego, cuando digo c.show(), por qué se necesita el miembro de datos de la clase Parent, no de la clase Child. Además, quiero saber que cuando creamos un objeto de clase Child sus miembros de datos de la clase Parent se colocan en la sección Parent del objeto de clase Child en Heap, pero ¿qué ocurre con las funciones de miembro?

Respuesta

4

El niño no puede ocultar un campo de un método en la clase principal simplemente declarando su propia versión del campo. Está aplicando la idea de "ocultamiento de datos" al revés. El niño nunca puede ocultar campos del padre, pero el padre puede ocultar los campos del niño (declarando x como private). Si quisiera, podría use encapsulation to achieve your desired effect, como:

class Parent{ 
    private int x=10; 

    public int getX() { 
     return x; 
    } 

    void show(){ 
     System.out.println(this.getX()); 
    } 
} 

class Child extends Parent{ 
    int x=20; 

    @Override 
    public int getX() { 
     return x; 
    } 

    public static void main(String[] args){ 
     Child c=new Child(); 
     c.show(); 
    } 
} 

reemplazando el método getX() de acceso, el niño puede ocultar el valor de la matriz de x del resto del mundo.

Algunos otros puntos vale la pena discutir:

Lo que sé es que cada vez que estamos extendiendo una clase de su matriz clase miembro de funciones y datos miembros están disponibles para la clase del niño

Esto no es del todo correcto. Los métodos privados y los miembros de datos no estarán (directamente) disponibles para la clase infantil. Solo los campos y métodos públicos, protegidos y de "nivel de paquete" serán directamente accesibles para la clase secundaria.

Además, quiero saber que cuando creamos un objeto de clase A de Child sus Padres clase de datos son miembros se ponen en la sección de Padres de Niños clase objeto en el montón, pero lo que sucede a miembros de la funciones?

Las funciones de miembro no se crean por instancia. Sería terriblemente ineficiente si la JVM funcionara así.En cambio, las implementaciones de métodos para una clase dada se definen solo una vez, como parte del Permanent Generation que contiene cosas como las definiciones de clases y otros estados internos de JVM. Todas las instancias de una clase determinada compartirán las mismas definiciones de método.

En el caso de una clase secundaria, compartirá las definiciones de método de su elemento primario, y también tendrá sus propias definiciones agregadas para cualquier método que exista solo en el elemento secundario (y para cualquier método que sobrescriba).

+1

+1 Puntos interesantes. – Mahesh

5

Lo que sé es que cada vez que estamos extendiendo una clase, su clase de clase miembro-función y miembros de datos están disponibles para la clase Child, entonces cuando digo c.show() por qué se necesita el dato-miembro de la clase para padres, no de la clase para niños.

Su comprensión es correcta. Pero lo contrario no es verdad. El subobjeto de clase primaria no tiene acceso al subobjeto de la clase hija. Dado que show() está en el alcance de la clase base Parent, está accediendo a sus propios miembros. Intente comentar el miembro x en la clase principal y vea si su programa se compila.

Commented x in parent class and see the output yourself

+0

cuando estoy comentando miembro 'x' en el padre que no compila y muestra el error en 'System.out.println (x)'. De acuerdo, puedo entender eso, pero no está claro para mí cómo se relaciona el alcance de la función con eso. –

+1

Una función de miembro de clase primaria solo puede acceder a sus miembros. Cuando haces una llamada a 'c.show();', actualmente estás en el ámbito de la clase 'Parent'. Tenía si la función miembro se reemplaza en la clase 'Child', entonces el alcance estaría en la clase' Child'. ** Cuando intenta acceder a una variable/método de instancia, debe estar dentro del alcance de la ubicación en la que se usa. ** – Mahesh

+0

Bien, pero mi segunda pregunta aún no ha sido respondida. Cuando creamos el objeto de la clase Child, en el objeto de la clase Heap a Child se crean los miembros de datos de la clase Child y dentro del objeto de clase Child hay otra sección donde también están los miembros de datos de la clase Parent. Entonces, ¿cómo el show() corresponde al miembro de datos de Parent? –

1

X en el niño sólo está sombreado sobre la clase base, no es primordial. La variable miembro de la clase base no se altera, solo está oculta por una variable separada en la clase secundaria que tiene el mismo nombre. Ellos todavía son variables completamente diferentes.

Cuestiones relacionadas