Autor Tema: JAVA - Error non static variable cannot be refered from static context solución  (Leído 1879 veces)

22bears

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 3
    • Ver Perfil
Buenas noches amigos. Estoy estudiando Java y me encontré con un error (Error non static variable cannot be refered from static context) que no puedo solucionar por el momento. ¿Qué puedo hacer para solucionarlo? Gracias

Código

Código: [Seleccionar]
package Funciones2;
public class Funciones2 {
public static void main (String[] args) {

int resultado = suma(10,10,2);
System.out.println(resultado);
Coche miCoche = new Coche(); //error: Non static variable cant be referenced from a static context
miCoche.agregarPuerta();
System.out.println(miCoche.puertas);
}
public static int suma(int a, int b, int c) {
//LÓGICA
int resultado = a + b + c;
return resultado;
}

class Coche {
public int puertas=0;
public void agregarPuerta() {
this.puertas++;
}
}

}
« Última modificación: 05 de Noviembre 2022, 20:44 por Ogramar »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 989
    • Ver Perfil
La clase Coche la has declarado dentro de la clase Funciones2

Bien, eso no es problema. Pero, si quieres que el método estático main() tenga acceso a la clase Coche, lo has de declarar también como estático.

Es decir, declárala así:

Citar
static class Coche {
    public int puertas = 0;
    public void agregarPuertas() {
        this.puertas++;
    }
}


En Java hay tres ámbitos: Local, Global y Estático(este se combina con los otros dos)

Según el ámbito donde se encuentre una variable (o un método, o una declaración de clase..) será visible o no para otros elementos.

El método main() se encuentra en un ámbito "global" porque está declarado directamente dentro de la clase principal Funciones2.
Tu clase Coche también es de ámbito "global" por el mismo motivo.

Sin embargo, el main() además de "global", es "estático" (obligatoriamente).
Esto implica que no puede hacer referencia (no puede ver) a otros elementos si no son estáticos como él.
Esto es lo que significa el error que te sale en pantalla.

Así que no te queda otra que declarar la clase Coche como estática, para que se encuentren en el mismo ámbito.

Si hubieras escrito la clase Coche en otro archivo .java distinto, es decir, que ya no pertenezca a Funciones2, entonces no habría surgido este problema porque ya se trataría de una clase independiente.

Pero al ser un miembro de Funciones2, igual que lo es main(), entonces sí que hay que igualar sus ámbitos.

Esto de los ámbitos "estáticos" y "no estáticos", al principio resulta confuso y algo difícil entender las implicaciones.
Así que ahora mismo, tampoco te preocupes demasiado por esto. Ya lo irás aprendiendo sobre la marcha.

Solo recuerda que habrá ocasiones en las que tendrás que declarar las cosas como static para que el main() pueda verlas.

Un saludo.
« Última modificación: 08 de Agosto 2022, 11:35 por Kabuto »
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

22bears

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 3
    • Ver Perfil
Gracias porque no solo me solucionaste el inconveniente, sino que de verdad me enseñaste la raíz del problema y aprendí algo nuevo gracias a tus conocimientos

 

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".