簡體   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