Autor Tema: JAVA "non-static variable this cannot be referenced from a static context" swing  (Leído 3695 veces)

lerner

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 2
    • Ver Perfil
¡Hola!

Estoy haciendo un programa de ejemplo para mostrar un frame en JAVA con la clase swing. Me ha salido un error de principiante, el "non-static variable this cannot be referenced from a static context".

Tengo un paquete llamado "graficos" en el que he metido un único fichero .java llamado "CreandoMarcos", dentro del cual tengo el método main, la clase "CreandoMarcos" y dos clases más: "miMarco" y "miMarcoBis". Estas dos últimas clases hacen lo mismo, pintar un frame en la pantalla; he creado dos sólo para hacer pruebas de sintaxis.

Mientras la clase "miMarco" la he declarado fuera de la clase "CreandoMarcos", la otra clase "miMarcoBis" la he declarado dentro de "CreandoMarcos" como clase interna suya. Y ahí he encontrado el primer problema, cuando instancio la clase "miMarcoBis" dentro del main recibo el error "non-static variable this cannot be referenced from a static context". Pongo el código que estoy escribiendo:

Código: [Seleccionar]
package graficos;
import javax.swing.*;

public class CreandoMarcos {

    public static void main(String[] args) {

        miMarco marco1 = new miMarco();
        marco1.setVisible(true);
        marco1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        miMarcoBis marco2 = new miMarcoBis();   // Aquí es donde me da el error...
    }

    class miMarcoBis extends JFrame {

        public miMarcoBis() {
            setSize(500, 300);
            setVisible(true);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
    }
}

class miMarco extends JFrame {

    public miMarco() {
        setSize(500, 300);
    }
}

¿Por qué no me deja en el main crear una instancia de miMarcoBis si declaro esa clase dentro de CreandoMarcos en lugar de fuera?

Gracias y un saludo,

Lerner
« Última modificación: 18 de Agosto 2017, 18:39 por Alex Rodríguez »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
Hmm.. no se si me voy a explicar bien.. Vamos a ver.

Primero, considera las clases como si fueran simples variables, aunque en realidad una clase sea algo mucho más complejo.

Dicho esto...
El problema está en que la clase miMarcoBis está declarada dentro de la clase CreandoMarcos.

La clase CreandoMarcos, no la estamos instanciando (no creamos un objeto CreandoMarcos)...lo que hacemos es ejecutar su metodo main(), que es un método estático.

Un método o una variable estática, significa que se puede ejecutar/acceder a ellos sin necesidad de instanciar la clase a la que pertenecen. Pero esto implica que dicho método (en este caso el main() ) no va a poder acceder a otros métodos o variables que no sean también estáticos igual que él, aunque pertenezcan a su misma clase

Si fuera del main() (pero dentro de la clase CreandoMarcos ), declaras una variable o método cualquiera.. verás que el main() no puede acceder a ellos si no los declaras como estáticos

Pongo un ejemplo muy sencillo:

Código: [Seleccionar]
public class MiClase {

    String saludo = "Hola compis";

    public static void main()(String[] args)
    {
        System.out.println(saludo)
    }
}

Este codigo, si lo probásemos.. daría el mismo error que te ha dado a tí.
Porque la variable saludo no es estática y el método main() si lo es.
A pesar de que la variable está ahí definida con un valor y todo, en realidad solamente podría existir si instanciasemos un objeto de la clase miClase

O si no, la solución es declararla como estática

Código: [Seleccionar]
public class MiClase {

    static String saludo = "Hola compis";

    public static void main()(String[] args)
    {
        System.out.println(saludo)
    }
}

Ahora el código si funcionaría, porque la variable saludo ahora es estática. Al igual que el método main(), pueden "existir" sin necesidad de instanciar un objeto de la clase miClase


Pues este mismo problema, es el problema que tiene tu clase miMarcoBis.
O la declaras fuera de la clase CreandoMarcos de manera que solo dependa de ella misma para "existir", o pruebas a declararla como static

No te se decir, cuál de las dos opciones es la más adecuada para este caso o cualquier otro.

No soy experto, soy un aprendiz más y la verdad nunca he usado clases estáticas.
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

lerner

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 2
    • Ver Perfil
Buenas tardes, Kabuto:

Gracias por tu extensa respuesta. Me ha quedado claro; lo he arreglado con sólo poner static delante de la clase. Para ser "un aprendiz más" lo has explicado muy bien.  :)

Saludos,

Lerner

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".