Pasar valor de variable INT a otra clase en Java

publicado por: Anonymous

Estoy usando Eclipse y JFrame para crear un programa. Necesito pasar el valor de una variable tipo INT de una clase a otra, pero, cuando intento hacerlo, el valor de la variable dentro del frame de la segunda clase es 0.

class Padre:

public class PAdre extends JFrame {

    /**
     * Global
     */
    private int id_pelicula = 2;

    /**
     * Create the frame.
     */
    public Padre() {
        setTitle("Clase Padre");
        setBounds(100, 100, 628, 410);
        JPanel contentPane = new JPanel();
        setContentPane(contentPane);

        btnVerReferencias = new JButton("Ver Ref.");
        btnVerReferencias.setEnabled(false);
        btnVerReferencias.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                claseHijo classHijo = new claseHijo ();
        // Paso el valor de la variable
                classHijo.setIdPelicula(id_pelicula);
                classHijo.setVisible(true);
            }
        });
        btnVerReferencias.setBounds(12, 288, 110, 74);
        contentPane.add(btnVerReferencias);

    }
}

class Hijo:

public class classHijo extends JFrame {

    /**
     * Global
     */
    private int id_pelicula;

  // Recibo el valor de la variable
    public void setIdPelicula(int id_pelicula) {
        this.id_pelicula = id_pelicula;
        }

    /**
     * Create the frame.
     */
    public classHijo () {
        setTitle("Clase Hijo");
        setBounds(100, 100, 628, 410);
        JPanel contentPane = new JPanel();
        setContentPane(contentPane);    

    // Le asigno el valor de la variable global
        int otraVariableINT = id_pelicula;
        System.out.println("otraVariableINT : " + otraVariableINT);
    }
}

Salida:

otraVariableINT: 0

Por qué la variable id_pelicula vale 0 dentro del frame de la clase Hijo?. Se supone que esta variable es global y mantiene su valor en toda la ejecución del programa no?.

Cuál es la forma correcta de pasar un valor a otra clase y que esté disponible para usar dentro del frame, qué hago mal?.

solución

Estas cometiendo el mismo error de la vez pasada. Recuerda que el constructor es el primer método en llamarse de un objeto. Eso es algo obvio porque cuando declaras la instancia de una clase, lo que estas haciendo es llamando al constructor.

claseHijo classHijo = new claseHijo ();

new claseHijo() es la instancia del objeto, que es tambien el constructor de la clase claseHijo. Ten eso en mente, cuando creas una instancia, estas llamando el constructor de esa clase.

Ahora bien, si te fijas bien, en el constructor estas imprimiendo el valor de la variable id_pelicula; el cual es cero (cero es el valor por defecto de las variables de tipo int) porque a la variable id_pelicula le pasas el valor cuando llamas el método setIdPelicula(), que se ejecuta después del constructor. Quizás me preguntes. Se puede llamar ese método antes que el constructor? No, no hay manera, el constructor siempre es el primer método que se llama de un objeto.

Sabiendo esto hay dos soluciones:

  1. Has lo que vallas a hacer con la variable id_pelicula (ya sea imprimirla, asignarla a otra variable… lo que sea) dentro del método setIdPelicula().

    public void setIdPelicula(int id_pelicula) {
    
        this.id_pelicula = id_pelicula;
    
        // Le asigno el valor de la variable global
        int otraVariableINT = id_pelicula;
    
        System.out.println("otraVariableINT : " + otraVariableINT);
    
    }
    
  2. Pasa el valor de la variable id_pelicula en el constructor de la clase.

    public classHijo (int id_pelicula) {
    
        this.id_pelicula = id_pelicula;
    
        setTitle("Clase Hijo");
        setBounds(100, 100, 628, 410); 
        JPanel contentPane = new JPanel();   
        setContentPane(contentPane); 
    
        // Le asigno el valor de la variable global 
        int otraVariableINT = id_pelicula;
        System.out.println("otraVariableINT : " + otraVariableINT); 
    }
    

Otras correcciones

Los nombres de las clases tienen que iniciar con mayuscula. No es solo por convención, eso ayuda a diferenciar las clases de los objetos y las variables.

classHijo ❌
ClassHijo ✅

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *