繁体   English   中英

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

[英]Different ways to initialize variables in 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()方法之外声明了三个实例变量,它在内部真的很重要吗?

这两者有区别吗?

是。 第一个代码段中的代码只能在startGame的上下文中startGame 如果不调用startGame ,则对象将保持为null 每次调用startGame ,旧对象(如果有)都将被丢弃,并替换为新对象。

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

在第一个示例中,为什么在startGame()方法之外声明了3个实例变量

声明实例变量的唯一方法是方法之外执行。 在方法内声明的变量是本地变量。

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

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

如果你从不调用startgame(),那么你就是在推迟分配它,也许用户永远不想开始游戏。 如果玩家需要大量内存来构建,并且您不希望用户等待它发生(内存分配),并且只是立即运行方法(不使用它们),这是很聪明的。

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

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

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

在第一个示例中,只有在调用方法startGame()时才会实例化对象。 在调用此方法之前, p1p2p3等于null

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

1st:方法startGame()初始化

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

第二名:在班级

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM