2012-05-08 17 views
6

Do subclasses inherit private fields?Do subclases Heredar instancia privada variables a partir de Superclases

Esta pregunta aborda el mismo problema pero yo no entiendo muy bien cómo que satisface la (aparentemente) situaciones contradictorias a continuación.

http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

dice que "Una subclase no hereda los miembros privados de su clase padre."

Esto significa que ni hereda variables de instancia privadas ni métodos privados ¿no?

Sin embargo, ¿cómo funciona esto si hereda un método de acceso público de su elemento primario? ¿Devuelve una variable de instancia que no sabe que existe?

Además, mi libro de informática (Baron's AP Computer Science A) tiene la respuesta correcta a una pregunta que dice que "La (Subclase) hereda todas las variables de instancia privadas y los métodos de acceso público de (Superclase)."

¿No está esto en contracción al tutorial de oráculo?

Gracias por su ayuda

Respuesta

0

Los miembros privados también se los hereda. Para probar esto, se puede hacer lo siguiente en la superclase:

//... 
private String myText = "I'm in the superclass"; 

private void setMyText(String myTextValue) 
{ 
    this.myText = myTextValue; 
} 

public void setMyTextPublic(String myTextValue) 
{ 
    setMyText(myTextValue); 
} 

public String getMyText() 
{ 
    return myText; 
} 
//... 

crear un método en la clase heredada:

//... 
public void setMyTextInTheSuperClass(String myTextValue) 
{ 
    System.out.println(getMyText()); 
    setMyTextPublic(myTextValue); 
    System.out.println(getMyText()); 
} 

public void setConstantValueToMyText() 
{ 
    setMyTextInTheSuperClass("I am in the child class"); 
} 
//... 

Y llama setConstantValueToMyText en alguna parte.

+1

Estoy a favor de los esquemas de asignación de nombres metasintácticos, pero en cierto punto puede complicarse. Probablemente deberías renombrar 'foobar' a' setFoo' y 'barfoo' a' getFoo'. – Jeffrey

+0

@Jeffrey, tiene toda la razón al señalar el problema del nombre, sin embargo, las nomenclaturas en el código de prueba no tenían ningún sentido a propósito para mostrar al operador, que probablemente es un novato, estamos hablando de cualquier miembro y función, no simplemente estableciendo u obteniendo valores. Sin embargo, tienes razón cuando dices sobre estos nombres que "no intentes esto en casa, tus nombres deberían tener sentido". –

+0

Supuse que la mayoría de la gente tendría la sensación de no nombrar sus métodos de esa manera en un código real, pero cuando traté de seguir su ejemplo me sentí levemente confundido. Solo puedo imaginar lo confuso que sería para un principiante. – Jeffrey

2

"no hereda" aquí significa que no se puede acceder a él. Todavía existe, pero no de ninguna manera con la que pueda interactuar (excepto llamando a métodos no privados de la superclase).

The accepted answer en la pregunta que ha vinculado explica eso. ¿Hay alguna parte particular de esa explicación que no esté clara?

+0

Lo que no está claro es por qué mi libro de texto dice que esa es la respuesta a esa pregunta. – Ian

+1

Simplemente significa algo un poco diferente por "hereda". – trutheality

+0

Eso tiene sentido, muchas gracias. – Ian

10

El acceso funciona bien. Recuerde que el acceso se ejecuta en el "contexto" de la superclase y, por lo tanto, el usuario podrá ver el miembro que está oculto de las subclases.

En cuanto al libro de texto, depende de su punto de vista. La subclase hereda los miembros privados en el sentido de que realmente están allí dentro de las instancias de la subclase (por lo que ocuparán memoria, etc.), pero la subclase no podrá acceder directamente a ellos.

+3

+1 Sí, tu respuesta puede enfatizarse con un ejemplo: los humanos heredamos (si creemos en la teoría de la evolución) algún tipo de cola de monos (una parte del hueso en el fondo) pero no pueden mover la cola. Solo pueden ver monos mientras juguetean con su historia, o darles plátanos para animarlos a que jueguen su cuento. –

+0

¿Y cómo se relaciona esto con la herencia de los métodos privados? ¿Han sido heredados pero están escondidos? No se puede usar (objeto de la subclase). (Método privado de superclsas) ¿verdad? editar: Lajos es un gran ejemplo. – Ian

+1

Está relacionado con el hecho de que la cola es un miembro privado de los monos, menear la historia es un método privado, porque solo los monos tienen colas y solo ellos pueden mover sus colas. Sin embargo, hay dos métodos: el primero es el método público de observar la cola de los monos, que se define en la clase base (mono) y también puede ser accesible para los humanos, que también pueden ver a los monos meneando su cuento, mientras el segundo es el método privado de dar banana a los monos, que solo es accesible para los humanos, porque los monos son egoístas y no se dan plátanos el uno al otro. –

1

Ciertamente, cuando se crea un objeto de una clase B que hereda de una clase A si la clase A tiene elementos privados, de acuerdo con las reglas de acceso en Java, que puede que no tenga acceso a, pero estos elementos hacerlo existen en la memoria privada, incluso como referencias nulas si eran objetos nulos.

En El lenguaje Java Especificación, se puede leer:

Una clase hereda de su superclase directa y superinterfaces directas todos los campos no privados de la superclase y superinterfaces que son ambos accesibles al código de la clase y no está oculta por una declaración en la clase.

A private campo de una superclase podría ser accesible para una subclase - por ejemplo, si ambas clases son miembros de la misma clase. Sin embargo, un campo private nunca es heredado por una subclase.

4

Piense en ello como una cebolla. Cada nivel de jerarquía es una capa dentro de la cebolla. Por ejemplo, si la clase C se extiende Clase B, la cual se extiende la clase A continuación, un objeto de la clase C se vería así:

Object of Class C

 ------------------------------------------------------------- 
     |               | 
     |     C and it's members      | 
     |               | 
     | ------------------------------------------------  | 
     | |            |  | 
     | |    B and it's members    |  | 
     | | ------------------------------------  |  |            
     | | |   A and it's members  |  |  | 
     | | |         |  |  | 
     | | ------------------------------------  |  |         
     | ------------------------------------------------  | 
     |               | 
     -------------------------------------------------------------    

Por lo tanto, un objeto de la clase C tiene miembros de B y A . Pero no se puede tener acceso a los miembros privados de B y A.

se puede sin embargo tener acceso a miembros públicos y protegidos de B y A.

lo tanto una función de acceso público de B o a permitiría que este objeto de la clase C a acceder a una variable de instancia privada de la clase B o clase A "parte" del objeto.

1

Si la subclase está en el mismo paquete, hereda miembros privados; de lo contrario, hereda solo miembros públicos y protegidos.

Cuestiones relacionadas