对实例和声明的误解



我是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")

举个例子。

相关内容

  • 没有找到相关文章

最新更新