Pregunta

Supongamos que tenemos una clase foo que tiene una variable de instancia privada barra .

Ahora tengamos otra clase, baz , que extiende foo . Los métodos no estáticos en baz pueden acceder a la barra de código variable foo si no hay un método de acceso definido en foo ?

Estoy trabajando en Java, por cierto.

¿Fue útil?

Solución

No, no de acuerdo con la lenguaje java especificación, 3ª edición :

  

6.6.8 Ejemplo: campos, métodos y constructores privados

     

Un privado   miembro de la clase o constructor es   Accesible solo dentro del cuerpo de la   clase de nivel superior (§7.6) que encierra   la declaración del miembro o   constructor. No es heredado por   subclases.

Pero independientemente de esta restricción de idioma, can accede a los campos privados a través de la reflexión :

Field privateStringField = 
   MyClass.class.getDeclaredField("privateString");
privateStringField.setAccessible(true);

String fieldValue = (String) privateStringField.get(privateObject);
System.out.println("fieldValue = " + fieldValue);

Otros consejos

No, para eso debes usar protected.

Para preguntas como esta, dónde se encuentra una tabla en el sitio web aquí: http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html

Básicamente, desea que las variables públicas o protegidas se declaren en foo ya que estas son las variables que las subclases heredan de su padre y, por lo tanto, se ven en baz.

Las clases secundarias no pueden acceder a miembros privados (que es el punto de control de acceso privado).

... si no hay un método de acceso definido en foo?

Necesitas accesores. Además, cuida la herencia, ¿debería esa var realmente estar en el padre? Recuerda el cheque IS-A ..

No puedes acceder a variables privadas en clases descendientes. Normalmente querría usar " protegido " o " paquete " (el valor predeterminado) el acceso de nivel para esto. Sin embargo, si desea ser realmente complicado, puede recurrir a la reflexión y AccessibleObject para obtenerlo. No recomendaría hacer eso para el código de producción a menos que esté realmente en un enlace; para pruebas, etc., está bien.

Para usar una variable privada de una súper clase en una subclase, se requiere un método de acceso. De lo contrario, utilice el modificador protegido en lugar de privado.

Las variables privadas de una clase invariablemente tienen un alcance dentro de esa clase. Si debe compartirse entre las subclases, debe declararse " protegido "

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top