Java成员初始化构造函数



在C 4年后,我将自己的第一步迈入了新的编程语言,我选择了Java。我正在尝试使用课程制作一个简单的tick脚钉脚趾游戏,但是我很难理解Java和C 之间的差异。

在一个Java类文件中,我有:

public class Game
{
    Player p1, p2;
    public Game(String p1Name, String p2Name)
    {
        System.out.println(p1Name + " vs. " + p2Name);
    }
}

在单独的Java类文件中,我有:

public class Player
{
    private String name;
    public Player(String name_in)
    {
        name = name_in;
    }
}

我想知道,如何在Game类中初始化Player p1, p2;,因为我不想给Player类A默认构造函数。我敢肯定,我可以像这样超载构造函数:

 public class Game
{
    Player p1, p2;
    public Game(String p1Name, String p2Name)
    {
        p1 = new Player(p1Name);
        p2 = new Player(p2Name);
        System.out.println(p1Name + " vs. " + p2Name);
    }
}

public class Player
{
    private String name;
    public Player() { }       
    public Player(String name_in)
    {
        name = name_in;
    }
}

但是,我想知道是否有一种方法可以初始化这些对象而无需声明它们然后初始化它们。即,只是初始化它们。如果是C ,我只会这样做:

tl; dr:下面的代码是C ,我将如何在Java中进行类似的"一步成员初始化"。

class Game
{
    private:
    Player p1, p2;
    public:
    Game(std::string p1Name, std::string p2Name) : p1(p1Name), p2(p2Name) //<--One step member initialization
    {
        std::cout << p1Name << " vs. " << p2Name;
    }
}

class Player
{
    private:
    std::string name; 
    public:
    Player(String name_in) : name(name_in) { }  //<--Holy crap, another one.
}

Java中没有一个步骤的成员初始化。最好的选择是在Game的构造函数中构造Player对象,

public class Game
{
    Player p1, p2;
    public Game(String p1Name, String p2Name)
    {
        p1 = new Player(p1Name);
        p2 = new Player(p2Name);
        System.out.println(p1Name + " vs. " + p2Name);
    }
}

或在Game的构造函数中接收Player对象。

public class Game
{
    Player p1, p2;
    public Game(Player p1, Player p2)
    {
        this.p1 = p1; 
        this.p2 = p2; 
    }
}

在Java中,没有像C 中的初始化器,也不需要一个。您的原始代码还可以:

public class Game
{
    Player p1, p2;
    public Game(String p1Name, String p2Name)
    {
        p1 = new Player(p1Name);
        p2 = new Player(p2Name);
        System.out.println(p1Name + " vs. " + p2Name);
    }
}

从您的问题来看,您似乎的印象是,使用上述代码,您需要为类玩家添加(不希望的)默认构造函数。不是。

请记住,与类似的C 声明不同,Java变量P1和P2是引用对对象而不是对象本身。在上面的代码中,P1和P2首先分配给NULL,然后在游戏构造函数中,将它们分配给新对象。这似乎很浪费,但是如果运行足够的时间,JIT可能会将不必要的任务优化为NULL,并且只需将P1和P2直接分配给新对象。

最新更新