我是Java的新手,正在创建游戏Snake。在游戏中,我创建了一个棋盘类,这个类的作用是创建一个 JFrame 来提供视觉表示(据我所知)。我的问题是我对代码缺乏理解。我不确定"公共静态董事会"是做什么的。我以为它创建了一个 Board 类的静态实例,尽管我认为这是不正确的。
我也在为"board = new Board();"这一行而苦苦挣扎,据我了解,这在 Board 类中创建了一个构造实例,但是,我不确定为什么我们将其分配给"board"。
public class Game {
/**
* @author HyperBlue
*/
//Declaring a static instance/object of Board, this can be accessed from anywhere in the program. The fact that it is static means that it cannot be edited. -- Not sure if right definition
public static Board board;
public static void main(String[] args) {
// TODO Auto-generated method stub
//Creates a static object board
board = new Board();
}
}
编辑:鉴于此,我认为public JFrame frame;
没有创建一个名为frame的JFrame的新实例是否正确?如果没有,那么它是否创建了一个我可以操作的变量?
public static Board board;
行声明了一个可以引用板的变量。在某种程度上,把它想象成一个盒子——你创建了一个空盒子。它里面什么都没有,但你现在有能力把东西放进那个盒子里。
语句的每个部分都告诉您有关该框的一些信息:
- 公共 :任何人都可以访问此框
- 静态 :该框与 Game 类相关联,而不是与特定实例相关联。就目前而言,只是认为这意味着永远只有一个盒子,而不是多个盒子。
- 板 :盒子的"类型"是
Board
- 只有Board
类型的东西适合盒子。 - 板:盒子的名称是"
board
"。如果要引用此框的内容,请使用名称board
。
您认为board = new Board();
创建了Board
的实例是对的。具体而言,new Board();
部分是创建新Board
实例的部分。通过说 board = new Board();
,您将新实例放在您之前声明的标记为board
的框中。从这里开始,你可以用名称 board
或类外部的 Game.board
来引用您创建的板。同样重要的是要知道,通过说board = new Board()
,board
以前的内容,如果有的话,现在已经丢失了。你把盒子倒掉了,这样你就可以把一个新对象放进去。显然,这里没有任何内容,但是当您使用任何面向对象语言(例如java)时,要记住这一点。
当你把
public static Board board;
这意味着在你的Java程序中有一个类级(静态)引用,它被命名为board。它可以保存一个 Board 实例。但是,在将实例分配给该引用之前,它不会指向任何内容。它只是内存中的一个参考。
当代码
board = new Board();
被处决。JVM创建Board类的实例,然后将该创建的实例分配给前面提到的电路板引用。因此,最后板引用现在指向板类实例。由于它是静态和公共的,因此您可以使用类名从任何地方访问它。例如
Game.board
第一个问题:
public static Board board;
到目前为止,您已经声明了一个具有公开可见性的 Board 类型的引用变量。它可以通过Game.Board在任何地方访问。静态修饰符意味着它附加到类(就像不需要类实例运行的静态方法一样,即 static void main(String[] args)
)。如果不使用 = 为引用分配任何内容,它只是内存中引用的分配。它没有指向任何东西。但它会在主要执行之后。
第二个问题。
board = new Board();
在 java 中,首先计算任何等号 (=) 的右侧,因此首先要计算new Board()
。它在 Board 类型的内存中创建一个新对象,并调用 board 类的默认构造函数(大概将所有实例变量设置为默认值。最后,对对象的引用(指向它的事物)被分配给板变量。所以现在,board.myMethod();
为板引用的特定实例调用 Board 类的 myMethod 方法。
这听起来很深奥,但它很重要。此外,有时这些步骤会组合在一起:
Human bob = new Human(); //default constructor (bob.name() == "name")
Human alice = new Human("alice"); //different constructor (alice.name() == "alice")
举个例子。