Java Can';不要在这里初始化数组

Java Can';不要在这里初始化数组,java,arrays,Java,Arrays,我是Java的新手,在代码中声明这个2d数组时遇到了麻烦。如果我这样做,我的代码将按预期工作: class game{ String player = "x"; String[][] board = {{" ", " ", " "}, {" ", " ", " "}, {" ", " ", " "}}; game(){ } public void make_move(int square){ board[square/3][sq

我是Java的新手,在代码中声明这个2d数组时遇到了麻烦。如果我这样做,我的代码将按预期工作:

class game{
    String player = "x";
    String[][] board = {{" ", " ", " "}, {" ", " ", " "}, {" ", " ", " "}};

     game(){
     }

     public void make_move(int square){
         board[square/3][square%3] = player;
         player = (player.equals("x")) ? "O" : "x";

     }
所以在这种情况下,棋盘和玩家会是实例变量吗?因为我没有使用static关键字,那么游戏的每个实例都会有一个单独的棋盘和玩家

来自python,我习惯于在构造函数中定义变量,并使用self.whatever等词作为实例属性。所以我试着在这里做同样的事情

class game{


     game(){
         String[][] this.board = {{" ", " ", " "}, {" ", " ", " "}, {" ", " ", " "}};
         String this.player = "x";
     }

     public void make_move(int square){
         board[square/3][square%3] = player;
         player = (player.equals("x")) ? "O" : "x";

     }
这根本不起作用,我遇到了多个错误。“这里不允许数组初始值设定项”和“无法解析符号‘player’”。有人能告诉我这里发生了什么,并给我指出正确的方向吗?谢谢

class Game{
String player;
String[][] board = null;

 Game(String playerName){ 
     this.player = playerName; 
     this.board = new String[][]{{" ", " ", " "}, {" ", " ", " "}, {" ", " ", " "}}`
 }

 public void makeMove(int square){
     board[square/3][square%3] = player;
     player = (player.equals("x")) ? "O" : "x";

 }
您需要理解java中变量作用域的概念,因为您来自Python。好的起点:

您在此处定义的player变量和board变量存在于此函数的作用域中,并在函数执行完成后立即删除,除非您返回值

由于构造函数不返回变量,因此必须在类级别声明变量,并在需要时在构造函数中初始化它们

您需要理解java中变量作用域的概念,因为您来自Python。好的起点:

您在此处定义的player变量和board变量存在于此函数的作用域中,并在函数执行完成后立即删除,除非您返回值


由于构造函数不返回变量,因此必须在类级别声明变量,并在需要时在构造函数中初始化它们

1:你说游戏和棋盘是实例变量是正确的

2:为了实际使用make_move方法,您必须创建一个游戏对象,因为它是一种非静态方法。在this.board声明中,您也不需要这样做;简单地说board=随便什么都可以,因为它是一个实例变量。但是,必须在构造函数之前初始化这些实例变量,否则构造函数不知道它正在更改哪些变量。你也可以

class game {
String[][] board;
String player;


game() {
    board = new String[][]{{" ", " ", " "}, {" ", " ", " "}, {" ", " ", " "}};
    player = "x";
}

public void make_move(int square) {
    board[square / 3][square % 3] = player;
    player = (player.equals("x")) ? "O" : "x";

} }
它使用构造函数定义由类或更简单的

class game {
String[][] board= new String[][]{{" ", " ", " "}, {" ", " ", " "}, {" ", " ", " "}};
String player="x";



public void make_move(int square) {
    board[square / 3][square % 3] = player;
    player = (player.equals("x")) ? "O" : "x";

}}

如果您希望游戏的所有实例对棋盘和玩家具有相同的初始值,则可以跳过构造函数,这可能不是您想要的。将来,学习java作用域规则,并记住始终在类定义中定义实例变量,而不是在构造函数中定义实例变量。

1:您说游戏和棋盘是实例变量是正确的

2:为了实际使用make_move方法,您必须创建一个游戏对象,因为它是一种非静态方法。在this.board声明中,您也不需要这样做;简单地说board=随便什么都可以,因为它是一个实例变量。但是,必须在构造函数之前初始化这些实例变量,否则构造函数不知道它正在更改哪些变量。你也可以

class game {
String[][] board;
String player;


game() {
    board = new String[][]{{" ", " ", " "}, {" ", " ", " "}, {" ", " ", " "}};
    player = "x";
}

public void make_move(int square) {
    board[square / 3][square % 3] = player;
    player = (player.equals("x")) ? "O" : "x";

} }
它使用构造函数定义由类或更简单的

class game {
String[][] board= new String[][]{{" ", " ", " "}, {" ", " ", " "}, {" ", " ", " "}};
String player="x";



public void make_move(int square) {
    board[square / 3][square % 3] = player;
    player = (player.equals("x")) ? "O" : "x";

}}

如果您希望游戏的所有实例对棋盘和玩家具有相同的初始值,则可以跳过构造函数,这可能不是您想要的。将来,请学习java作用域规则,并记住始终在类定义中定义实例变量,而不是在构造函数中定义。

可能重复@user7与其说是如何初始化数组,不如说是作用域问题。我相信这个问题可能会有重复的问题,但你发布的不是这个问题。在发布这样的问题之前,请先阅读一本书或教程,提供Java的基本介绍。这是任何介绍性文本都会涉及的基本语法。@user7可能重复。与其说是如何初始化数组,不如说是范围问题。我相信这个问题可能会有重复的问题,但你发布的不是这个问题。在发布这样的问题之前,请先阅读一本书或教程,提供Java的基本介绍。这是任何介绍性文本都会用到的基本语法。您发布的代码无法解决此错误。仍将获得“此处不允许使用数组初始值设定项”@Jonathan更正。另一方面,类名应该是Pascal大小写,方法名应该是Camel大小写。方法名应为Pascal大小写。您发布的代码无法解决此错误。仍将获得“此处不允许使用数组初始值设定项”@Jonathan更正。另一方面,类名应该是Pascal大小写,方法名应该是Camel大小写。方法名应该是Pascal大小写的。谢谢。那么,在您发布的第一个选项中,变量board和player是否配备了类级范围,因为您首先在方法之外声明了它们?如果您将第一个修改为String[]]board=new String[][]{{,“,”},{,“,”,“},{,“,”,“},{,”,“},{,”,“}}而没有首先在类下声明变量,那么它将仅在构造函数中定义?是的,如果它们在类定义中声明,则具有类级作用域。在第二点上你也是正确的:如果你这样做,你就不能在构造函数之外使用board变量(因此它基本上是无用的,除非你用它来定义其他实例变量),除非你让构造函数返回字符串[][],这可能是你不想要的。啊,谢谢你。那么,在您发布的第一个选项中,变量board和player是否配备了类级范围,因为您首先在方法之外声明了它们?如果您将第一个修改为String[]]board=newstring[][]{{,“,”},{,“,”},{,“,”},{,“,”},{,“,”}}而没有首先在类下声明变量,那么它只会在构造函数中定义?是的,它们有