构造函数中的Java成员初始化

时间:2017-03-06 00:17:03

标签: java

我在c ++工作了4年后,迈出了第一步,开始学习新的编程语言,并且我选择了Java。我正在尝试使用类来制作一个简单的刻度脚趾游戏,但我很难理解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;
    }
}

我想知道如何在Player p1, p2;课程中初始化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);
    }
}
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.
}

2 个答案:

答案 0 :(得分:4)

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

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);
    }
}

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

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

答案 1 :(得分:1)

在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);
    }
}

根据您的问题,您似乎认为使用上述代码您需要为类Player添加(不需要的)默认构造函数。不是这样。

请记住,与类似的C ++声明不同,Java变量p1和p2是对象的引用,而不是对象本身。在上面的代码中,首先将p1和p2指定为null,然后在Game构造函数中将它们分配给新对象。这可能看起来很浪费,但是如果它运行的次数足够多,JIT可能会将不必要的赋值优化为null,只需将p1和p2直接分配给新对象。