Java Can';不要在这里初始化数组
我是Java的新手,在代码中声明这个2d数组时遇到了麻烦。如果我这样做,我的代码将按预期工作: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
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[][]{{,“,”},{,“,”},{,“,”},{,“,”},{,“,”}}而没有首先在类下声明变量,那么它只会在构造函数中定义?是的,它们有