Нестационарный метод не может ссылаться на статический контекст

Первый код:

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 

Вот сообщение об ошибке:

TicTacToe.java:85: non-static method nextInt(int) cannot be referenced from a static context
            a = Random.nextInt(10) ;
                      ^

Что именно случилось? Что означает сообщение об ошибке "нестационарный метод не может быть ссылкой из статического контекста"?

Ответы

Ответ 1

Вы вызываете nextInt статически, используя Random.nextInt.

Вместо этого создайте переменную Random r = new Random();, а затем вызовите r.nextInt(10).

Было бы обязательно проверить:

Обновление:

Вы действительно должны заменить эту строку,

Random Random = new Random(); 

с чем-то вроде этого,

Random r = new Random();

Если вы используете имена переменных как имена классов, вы столкнетесь с нагрузкой на лодку. Также как соглашение Java, используйте имена нижнего регистра для переменных. Это может помочь избежать путаницы.

Ответ 2

Вы пытаетесь вызвать метод экземпляра для класса.

Вам следует:

    Random rand = new Random();
    int a = 0 ; 
    while (!done) { 
        int a = rand.nextInt(10) ; 
    ....

Вместо

Как я уже говорил вам fooobar.com/questions/339378/...

Ответ 3

В Java статические методы относятся к классу, а не к экземпляру. Это означает, что вы не можете вызывать другие методы экземпляра из статических методов, если они не вызываются в экземпляре, который вы инициализировали в этом методе.

Здесь вы можете что-то сделать:

public class Foo
{
  public void fee()
  {
     //do stuff  
  }

  public static void main (String[]arg) 
  { 
     Foo foo = new Foo();
     foo.fee();
  } 
}

Обратите внимание, что вы запускаете метод экземпляра из экземпляра, который вы создали. Вы не можете просто вызвать метод экземпляра класса непосредственно из статического метода, потому что нет экземпляра, связанного с этим статическим методом.

Ответ 4

Нарушение соглашений об именах Java (имена переменных и имена методов начинаются с нижнего регистра, имена классов начинаются с верхнего регистра) вносит свой вклад в ваше замешательство.

Переменная Random только "в области видимости" внутри метода main. Он недоступен для любых методов, называемых main. Когда вы возвращаетесь из main, переменная исчезает (она является частью фрейма стека).

Если вы хотите, чтобы все методы вашего класса использовали один и тот же экземпляр Random, объявите переменную-член:

class MyObj {
  private final Random random = new Random();
  public void compTurn() {
    while (true) {
      int a = random.nextInt(10);
      if (possibles[a] == 1) 
        break;
    }
  }
}