对实例和声明的误解

时间:2014-12-31 02:56:23

标签: java variables object instance main

我是Java的完全新手,也是创建游戏Snake的过程。在游戏中我创建了一个Board类,这个类的作用是创建一个JFrame来提供可视化表示(据我所知)。我的问题在于我对代码缺乏了解。我不确定"公共静态板?"确实。我以为它创建了一个董事会类的静态实例,但我相信这不是正确的。

我也在努力使用线路" 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新实例?如果没有,那么它是否会创建一个我可以操作的变量?

3 个答案:

答案 0 :(得分:2)

public static Board board;声明一个可以引用电路板的变量。在某种程度上,把它想象成一个盒子 - 你创建了一个空盒子。它没有任何内容,但你现在有能力把东西放在那个盒子里。

声明的每个部分都会告诉你关于这个方框的一些信息:

  • 公开:任何人都可以访问此框
  • static:该框与Game 相关联,而不是特定的实例。就目前而言,只是意味着总会有一个盒子,而不是多个盒子。
  • 董事会:"类型"该框的内容为Board - 只有Board类型的内容适合方框。
  • board:该框的名称为" board"。如果要引用此框的内容,请使用名称board

您认为board = new Board();创建Board的实例是正确的。具体来说,new Board();部分是创建新Board实例的部分。通过说board = new Board();,您将新实例放在前面声明的标记为board的框中。从现在开始,您可以通过名称board或此类之外的Game.board来引用您创建的电路板。同样重要的是要知道board = new Board()board的先前内容(如果有的话)现在已经丢失了。你倾倒了盒子,所以你可以在里面放一个新的物体。显然,这里没有任何东西,但是当你在任何面向对象的语言(例如java)中前进时,要记住这一点。

答案 1 :(得分:1)

当你把

public static Board board;

这意味着在Java程序中有一个类级别(静态)引用,它被命名为board。它可以容纳一个Board实例。 但是,除非您为该引用分配实例,否则它将指向任何内容。它只是记忆中的一个参考。

当代码

board = new Board();

被执行。 JVM创建Board类的实例,然后将创建的实例分配给早期提到的板参考。 所以最后板引用现在指向Board类实例。 由于它是静态的和公共的,因此您可以从具有类名的任何位置访问它。 e.g。

Game.board

答案 2 :(得分:1)

第一个问题:

public static Board board;

到目前为止,您已声明具有公共可见性的Board类型的引用变量。它可以通过Game.Board随处访问。 static修饰符意味着它附加到类(就像不需要运行类的实例的静态方法,即static void main(String[] args))。如果没有使用=为引用赋值,它只是在内存中为引用分配。它没有任何意义。但它会在主要执行之后。

第二个问题。

board = new Board();

在java中,首先评估任何等号(=)的右侧,因此new Board()是首先发生的事情。它在Board类型的内存中创建一个新对象,并调用board类的默认构造函数(可能将所有实例变量设置为默认值。最后,对象的引用,指向它的东西,被分配给board变量那么现在,board.myMethod();将为Board所引用的特定实例调用Board类的方法myMethod。

听起来很神秘,但这很重要。此外,有时这些步骤合并:

Human bob = new Human(); //default constructor (bob.name() == "name")
Human alice = new Human("alice"); //different constructor (alice.name() == "alice")

仅作为一个例子。