No se puede hacer referencia a una variable no estática desde un contexto estático
He escrito este código de prueba:
class MyProgram
{
int count = 0;
public static void main(String[] args)
{
System.out.println(count);
}
}
Pero da el siguiente error:
Main.java:6: error: non-static variable count cannot be referenced from a static context
System.out.println(count);
^
¿Cómo consigo que mis métodos reconozcan las variables de mi clase?
Debe comprender la diferencia entre una clase y una instancia de esa clase. Si ves un coche en la calle, sabes inmediatamente que es un coche, incluso si no puedes ver qué modelo o tipo. Esto se debe a que comparas lo que ves con la clase "automóvil". La clase contiene algo similar a todos los coches. Piense en ello como una plantilla o una idea.
Al mismo tiempo, el coche que ves es una instancia de la clase "coche", ya que tiene todas las propiedades que esperas: hay alguien conduciéndolo, tiene motor, ruedas.
Entonces la clase dice "todos los autos tienen un color" y la instancia dice "este auto específico es rojo".
En el mundo OO, defines la clase y dentro de la clase, defines un campo de tipo Color
. Cuando se crea una instancia de la clase (cuando crea una instancia específica), la memoria se reserva para el color y puede darle un color a esta instancia específica. Dado que estos atributos son específicos, no son estáticos.
Los campos y métodos estáticos se comparten con todas las instancias. Son para valores que son específicos de la clase y no de una instancia específica. Para los métodos, estos suelen ser métodos auxiliares globales (como Integer.parseInt()
). Para los campos, generalmente son constantes (como tipos de automóviles, es decir, algo en lo que tienes un conjunto limitado que no cambia con frecuencia).
Para resolver su problema, necesita crear una instancia (crear un objeto) de su clase para que el tiempo de ejecución pueda reservar memoria para la instancia (de lo contrario, diferentes instancias se sobrescribirían entre sí, lo que no desea).
En su caso, pruebe este código como punto de partida:
public static void main (String[] args)
{
try
{
MyProgram7 obj = new MyProgram7 ();
obj.run (args);
}
catch (Exception e)
{
e.printStackTrace ();
}
}
// instance variables here
public void run (String[] args) throws Exception
{
// put your code here
}
El nuevo main()
método crea una instancia de la clase que contiene (suena extraño, pero como main()
se crea con la clase en lugar de con la instancia, puede hacer esto) y luego llama a un método de instancia ( run()
).
Los campos y métodos estáticos están conectados a la clase misma y no a sus instancias. Si tiene una clase A
, un método 'normal' (generalmente llamado instancia) b
y un método estático c
, y crea una instancia a
de su clase A
, las llamadas a A.c()
y a.b()
son válidas. El método c()
no tiene idea de qué instancia está conectada, por lo que no puede utilizar campos no estáticos.
La solución para usted es que haga sus campos estáticos o sus métodos no estáticos. Tu principal podría verse así entonces:
class Programm {
public static void main(String[] args) {
Programm programm = new Programm();
programm.start();
}
public void start() {
// can now access non-static fields
}
}