[英]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.