variable valor referencias referencia que por paso pasar parĂ¡metros parametros parametro objeto enviar entero datos como arreglo java inheritance nullpointerexception abstract-class

java - valor - No se puede acceder a una referencia de objeto instanciada por una clase de hermano



que es el paso por referencia en java (4)

Amigo, debes ser nuevo en la programación orientada a objetos .

Una clase es una plantilla para objetos. Cuando crea una instancia de una clase (es decir, new Child() ), la memoria se asigna en el montón para almacenar las variables de instancia de ese objeto. Esa memoria, que contiene las variables del objeto, es solo para ese objeto. Cada vez que crea un objeto, tiene sus propias variables de instancia en un espacio de memoria separado.

Tengo una clase abstracta que declara varias referencias a objetos, específicamente un JLabel. Tengo dos clases que extienden esa clase. Uno de los niños crea una instancia de JLabel y llama a algunos de sus métodos. Ese hermano de clases intenta llamar al método setText en JLabel y obtengo una NullPointerException (El hermano que crea la instancia se llama antes que el otro).

Pensé que todos los niños se refieren al mismo objeto en la memoria y modificarían el mismo objeto, pero aparentemente estoy equivocado. ¿Cómo puedo evitar esto?

Aquí hay un ejemplo de lo que quiero decir:

public class BlahDriver { public static void main(String[] args) { BlahChildOne blah = new BlahChildOne(); BlahChildTwo blah2 = new BlahChildTwo(); } } public abstract class Blah { protected JLabel label; } public class BlahChildOne extends Blah { public BlahChildOne() { label = new JLabel(); } } public class BlahChildTwo extends Blah { public BlahChildTwo() { label.setText("Fred"); } }

Obtengo una NullPointerException en BlahChildTwo cuando intento establecerText.


Entonces, bla define un campo de instancia llamado label pero no lo inicializa

public abstract class Blah { protected JLabel label; }

BlahChildOne inicializa la label de Blah

public class BlahChildOne extends Blah { public BlahChildOne() { label = new JLabel(); } }

BlahChildTwo no inicializa la label de Blah , por lo que sigue siendo null ...

public class BlahChildTwo extends Blah { public BlahChildTwo() { label.setText("Fred"); } }

Ni BlahChildOne ni BlahChildTwo comparten información entre ellos (tienen algo en común a través de la herencia de Blah , pero la información en realidad es propiedad de cada uno).

Piense en ello como si fueran gemelos idénticos, podrían compartir algo en común, pero el hecho de que uno se enferme, no significa que el otro lo haga, sino que son su propia instancia autocontenida.

SI desea compartir información entre clases, debería considerar proporcionar una referencia a la clase con la información que desea compartir, por ejemplo ...

public class BlahChildTwo extends Blah { public BlahChildTwo(Blah blah) { label = blah.label; label.setText("Fred"); } }

Pero realmente me gustaría ver un caso de uso para algo tan drástico ...

Por qué la static es considerada mala

Asumamos...

public abstract class Blah { protected static JLabel label; }

Ahora en tu código, haces algo como ...

BlahChildOne bco = new BlahChildOne(); add(bco.label); // It the label to the screen... BlahChildTwo bct = new BlahChildTwo();

De acuerdo, hasta ahora, muy bien. Ahora imagina, en otro lugar en tu código, lo haces ...

BlahChildOne bco = new BlahChildOne(); BlahChildTwo bct = new BlahChildTwo();

... Pero ¿por qué no se actualizó la pantalla? Debido a que la Blah#label ya no apunta a JLabel que agregó previamente a la pantalla, ha perdido esa referencia.

Es difícil encontrar el depurador, incluso cuando sabes lo que estás buscando, porque no hay responsabilidad, cualquier clase que extienda Blah puede crear una nueva instancia de JLabel y asignarla a la label .


Esta línea protected JLabel label; no crea objeto, solo es una variable de referencia, entonces cuando ambas clases se extienden a la clase abstracta. Ambas clases tienen sus propias copias separadas de la variable de referencia

BlahChildTwo tiene su propia copia de la variable de referencia JLabel que no está instanciada y es por eso que enfrenta NullPointerException

Ahora llegando a tu pregunta

I had thought that all children refer to the same object in memory and would thus modify the same object but apparently I''m wrong. How can I get thus modify the same object but apparently I''m wrong. How can I get around this?

Sí, todos los niños se referirán al mismo objeto si ese es un objeto. No es una variable de referencia.


Todos los niños no se refieren al mismo objeto. Cada objeto secundario será un nuevo objeto que tendrá su propia copia de todas las referencias declaradas en el padre, así como una copia de todas las referencias declaradas en sí mismo.

Si desea acceder a la misma referencia entre clases, intente hacerlo static en la clase principal.