java - no se puede hacer referencia a un método no estático desde un contexto estático
static (4)
En Java, los métodos estáticos pertenecen a la clase en lugar de a la instancia. Esto significa que no puede llamar a otros métodos de instancia desde métodos estáticos a menos que se los llame en una instancia que haya inicializado en ese método.
Aquí hay algo que podrías querer hacer:
public class Foo
{
public void fee()
{
//do stuff
}
public static void main (String[]arg)
{
Foo foo = new Foo();
foo.fee();
}
}
Observe que está ejecutando un método de instancia desde una instancia que ha creado. No puede simplemente llamar a un método de instancia de clase directamente desde un método estático porque no hay ninguna instancia relacionada con ese método estático.
Esta pregunta ya tiene una respuesta aquí:
Primero un código:
import java.util.*;
//...
class TicTacToe
{
//...
public static void main (String[]arg)
{
Random Random = new Random() ;
toerunner () ; // this leads to a path of
// methods that eventualy gets us to the rest of the code
}
//...
public void CompTurn (int type, boolean debug)
{
//...
boolean done = true ;
int a = 0 ;
while (!done)
{
a = Random.nextInt(10) ;
if (debug) { int i = 0 ; while (i<20) { System.out.print (a+", ") ; i++; }}
if (possibles[a]==1) done = true ;
}
this.board[a] = 2 ;
}
//...
} //to close the class
Aquí está el mensaje de error:
TicTacToe.java:85: non-static method nextInt(int) cannot be referenced from a static context
a = Random.nextInt(10) ;
^
¿Qué fue exactamente lo que salió mal? ¿Qué significa el mensaje de error "no se puede hacer referencia al método no estático desde un contexto estático"?
Está llamando a nextInt
estáticamente usando Random.nextInt
.
En su lugar, cree una variable, Random r = new Random();
y luego llamar a r.nextInt(10)
.
Definitivamente valdría la pena echar un vistazo:
Actualizar:
Realmente deberías reemplazar esta línea,
Random Random = new Random();
con algo como esto,
Random r = new Random();
Si usa nombres de variables como nombres de clase, se encontrará con una gran cantidad de problemas. También como una convención de Java, use nombres en minúsculas para las variables. Eso podría ayudar a evitar alguna confusión.
Estás intentando invocar un método de instancia en la propia clase.
Deberías hacer:
Random rand = new Random();
int a = 0 ;
while (!done) {
int a = rand.nextInt(10) ;
....
En lugar
Como te dije aquí .com/questions/2694470/whats-wrong...
La violación de las convenciones de nomenclatura de Java (nombres de variables y nombres de métodos comienzan con minúsculas, los nombres de clases comienzan con mayúsculas) contribuye a su confusión.
La variable Random
solo está "dentro del alcance" dentro del método main
. No es accesible a ninguno de los métodos llamados por main
. Cuando regresa de main
, la variable desaparece (es parte del marco de pila).
Si desea que todos los métodos de su clase usen la misma instancia Random
, declare una variable miembro:
class MyObj {
private final Random random = new Random();
public void compTurn() {
while (true) {
int a = random.nextInt(10);
if (possibles[a] == 1)
break;
}
}
}