我遇到了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()方法之外声明了三个实例变量,它在内部真的很重要吗?
答案 0 :(得分:10)
两者之间有区别吗?
是。第一个代码段中的代码仅在startGame
的上下文中执行。如果您不致电startGame
,对象将保持null
。每次调用startGame
时,旧对象(如果有)将被丢弃,并替换为新对象。
当您调用任何构造函数时,第二个代码段将对每个GuessGame
对象执行一次。代码将在所有构造函数之间共享。
在第一个示例中,为什么在
之外声明了3个实例变量startGame()
方法
声明实例变量的唯一方法是在外部方法中执行此操作。在方法中声明的变量是 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()
,p1
和p2
等于p3
。
在第二个示例中,您直接声明并实例化它们。所以他们在课堂创作时被实例化。
答案 4 :(得分:2)
1st:方法startGame()的初始化
guessgame gg = new guessgame() // Here p1 is null
第二名:在班级
GuessGame GG = new GuessGame() // OK p1 is initialized
答案 5 :(得分:1)
p1
,p2
,p3
不是局部变量,而是类字段。
构造类实例后,它们可用于所有类方法。
在第一个代码段中,三个字段的值为null
,直到调用方法startGame()
。
在第二个片段中,在实例构建期间初始化字段。