[英]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()
时才会实例化对象。 在调用此方法之前, p1
, p2
和p3
等于null
。
在第二个示例中,您直接声明并实例化它们。 所以他们在创建类时被实例化。
1st:方法startGame()初始化
guessgame gg = new guessgame() // Here p1 is null
第二名:在班级
GuessGame GG = new GuessGame() // OK p1 is initialized
p1
, p2
, p3
不是局部变量,而是类字段。
构造类实例后,它们可用于所有类方法。
在第一个代码段中,三个字段的null
直到调用方法startGame()
。
在第二个片段中,在实例构建期间初始化字段。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.