在Java中初始化变量的不同方法

时间:2015-10-23 13:48:25

标签: java

我遇到了guessgame的代码。有一个代码片段,其中三个播放器对象按以下方式初始化:

public class guessgame{
    Player p1;
    Player p2;
    Player p3;
    public void startGame() {
        p1 = new Player();
        p2 = new Player();
        p3 = new Player();
    ...
    }
    ...
}

当我宣布并以下列方式启动时,同样有效。

public class GuessGame {
    Player p1 = new Player();
    Player p2 = new Player();
    Player p3 = new Player();
    public void startGame(){
        ...
    }
    ...
}

这两者有区别吗?在第一个例子中,为什么在startgame()方法之外声明了三个实例变量,它在内部真的很重要吗?

6 个答案:

答案 0 :(得分:10)

  

两者之间有区别吗?

是。第一个代码段中的代码仅在startGame的上下文中执行。如果您不致电startGame,对象将保持null。每次调用startGame时,旧对象(如果有)将被丢弃,并替换为新对象。

当您调用任何构造函数时,第二个代码段将对每个GuessGame对象执行一次。代码将在所有构造函数之间共享。

  

在第一个示例中,为什么在startGame()方法

之外声明了3个实例变量

声明实例变量的唯一方法是在外部方法中执行此操作。在方法中声明的变量是 locals

第一种和第二种方式之间的另一个区别是,只有在第一个代码片段中调用startGame后,调用访问玩家的实例方法才会变得“合法”。

答案 1 :(得分:7)

如果在方法外部初始化,则在实例化类并为其分配内存时执行。如果你没有,它只会获得分配给它们的null(或基元的默认值)。

如果您从未调用startgame(),那么您将延迟分配它,并且用户可能永远不想启动游戏。如果玩家需要大量内存来构建,并且您不希望用户等待发生(内存分配),并且只是立即运行方法(不使用它们),这很聪明

如果由于某种原因你有几种方法需要使用p1,p2,p3变量,那么初始化谁的协调可能会令人困惑,所以你可能会咬紧牙关并预先初始化它们。如果你知道会有3名玩家,为什么还要用它来打扰这些方法呢?否则你必须做类似的事情:

if (p1 == null){
    p1 = new Player();
}

答案 2 :(得分:3)

在第二种方法中,您只需同时执行两项操作 - 声明和初始化。不同之处在于,您需要在第一个示例中运行{{1}}方法来初始化它们。

答案 3 :(得分:3)

在第一个示例中,只有在调用方法//this.map = new HashMap(); this.map = new LinkedHashMap(); 时才会实例化对象。在调用此方法之前,startGame()p1p2等于p3

在第二个示例中,您直接声明并实例化它们。所以他们在课堂创作时被实例化。

答案 4 :(得分:2)

1st:方法startGame()的初始化

guessgame gg = new guessgame() // Here p1 is null

第二名:在班级

GuessGame GG = new GuessGame() // OK p1 is initialized

答案 5 :(得分:1)

p1p2p3不是局部变量,而是类字段。

构造类实例后,它们可用于所有类方法。

在第一个代码段中,三个字段的值为null ,直到调用方法startGame()

在第二个片段中,在实例构建期间初始化字段。