Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中初始化变量的不同方法_Java - Fatal编程技术网

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

Java中初始化变量的不同方法,java,Java,我偶然发现了猜游戏的代码。有一个代码段,其中三个播放器对象按以下方式初始化: 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;
    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()
方法来初始化它们。

p1
p2
p3
不是局部变量,而是类字段

在构建类实例之后,所有类方法都可以使用它们

在第一个代码段中,在调用方法
startGame()
之前,这三个字段的值都是
null

在第二个代码段中,字段在实例构造期间初始化

这两者有区别吗

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

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

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

声明实例变量的唯一方法是在方法外部执行。方法中声明的变量是局部变量


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

如果在方法外部初始化,则在实例化类并为其分配内存时执行该方法。如果不这样做,它只会为它们分配一个空值(或原语的默认值)

如果您从未调用startgame(),那么您将延迟分配它,并且用户可能永远不想启动游戏。如果玩家需要大量内存来构建,并且您不希望用户等待内存分配,而只是立即运行方法(不使用它们),那么这是明智的

如果出于某种原因,您有几个方法需要使用p1、p2、p3变量,那么谁将初始化的协调可能会令人困惑,因此您可能会咬紧牙关,预先初始化它们。如果你知道会有3名球员,为什么要用它来麻烦方法呢?否则,您必须执行以下操作:

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

在第一个示例中,仅当调用方法
startGame()
时才会实例化对象。在调用此方法之前,
p1
p2
p3
等于
null


在第二个示例中,直接声明和实例化它们。因此,它们在类的创建时被实例化。

1st:startGame()方法的初始化

第二名:班级级别

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

第二个版本在实例化
GuessGame
类时初始化三名玩家,第一个版本在
StartName()时初始化他们
运行。@CaffeineToCode在这两种情况下,它们都是在类级别声明的。Linux与此有什么关系?让变量在类级别单位化或将其初始化为空对象或指示其单位化的东西可能会很有用。这样,您就可以知道是否已经执行了一个方法。但这实际上取决于代码的设计。第二个示例缺少startGame方法的右括号。这让我有点疯狂。在
startGame()
中初始化的主要优点是,您可以随时通过调用
startGame()
启动新游戏,玩家将被重新初始化。如果
Player
持有分数等可变数据,这一点很重要。但是,这并不是相互排斥的。假设我将其命名为restartGame()并再次初始化对象,也应该可以正常工作。
GuessGame GG = new GuessGame() // OK p1 is initialized