构造函数已经在课堂中定义



我开始学习Java,并正在编码简单的曲棍球统计类。看起来这样:

public class Player 
{
    private int games; 
    private int goals;
    private int assists;
    private char position;

    public Player()
    {
        games = 0;
        goals = 0;
        assists = 0;
        position = 'X';
    }

    public Player(int initialGames, int initialGoals, int initialAssists, 
    char initialPosition )
    {
        games = initialGames;
        goals = initialGoals;
        assists = initialAssists;
        position = initialPosition;
    } 
    public void setPlayer(int newGames, int newGoals, int newAssists, char 
newPosition)
    {
        games = newGames;
        goals = newGoals;
        assists = newAssists;
        position = newPosition;
    } 
    public Player(int initialGames)
    {
        games = initialGames;
        goals = 0;
        assists = 0;
        position = 'X';
    }
    public void setGames(int newGames)
    {
        games = newGames;
    }
    public Player(int initialGoals)
    {
        games = 0;
        goals = initialGoals;
        assists = 0;
        position = 'X';
    }

}

现在,这一切都罚款,直到我输入最后一个块的代码为止。当我尝试编译它时,我会收到此错误:

(player.java:52错误:constructor player(int(已经在类玩家中定义(

我在做什么错?我非常紧密地遵循教科书的格式来构建此类课程,但是我一直遇到此错误。有人可以给我一个原因吗?因为我不完全了解此编译器错误。

您尚未正确载体。

您有2个具有相同签名的构造函数。

public Player(int initialGoals)
    {
        games = 0;
        goals = initialGoals;
        assists = 0;
        position = 'X';
    }

public Player(int initialGames)
    {
        games = initialGames;
        goals = 0;
        assists = 0;
        position = 'X';
    }

因此,一个快速解决方案将合并两个构造函数。

public Player(int initialGoals, int initialGames)
    {
        games = initialGames;
        goals = initialGoals;
        assists = 0;
        position = 'X';
    }

有一个单个构造函数并在不可用时通过零。

for ex

Player p = new Player(5,0); // games 0
Player p = new Player(0,5); // goals 0

您复制了构造函数,编译器在键入new Player(8)时无法决定要拨打哪一个:

public Player(int initialGoals)
public Player(int initialGames)

尝试从一组新方法

调用new Player()
static Player NewPlayerFromGoals(int initialGoals){...}
static Player NewPlayerFromGames(int initialGames){...}

并用

称呼它
Player p = Player.NewPlayerFromGoals(8);

不允许具有相同参数的多个构造函数。创建多个构造函数时,具有一个主构造函数,用每个可能的参数构建对象。如果允许使用较少参数创建对象,则创建另一个调用主构造函数的构造函数。

public Player(int games){
    this(games, 0, 0, 0);
}
public Player(int games, int goals, int assists, char position){
    this.games = games;
    this.goals = goals;
    this.assists = assists;
    this.position = position;
}

可以创建更多的构造函数,以使用与第一个构造函数相同的格式来容纳更多参数。

public Player(int initialGoals)
{
    games = 0;
    goals = initialGoals;
    assists = 0;
    position = 'X';
}

public Player(int initialGames)
{
    games = initialGames;
    goals = 0;
    assists = 0;
    position = 'X';
}

具有相同的签名Player(int)。因此,您应该更改构造函数或删除一个。

编辑(我为澄清添加了更多代码(

方法1:

enum ConstructorType {
 GOAL,
 GAME
}
public Player(int value, ValueType type)
{
    switch(type){
      case GOAL:
goals = value;
        break;
      case GAME:
games = value;
         break;
default:
break;
    }
this(games, goals, 0, 'X'); // Prefer this one instead of repeat your constructor code.
}

方法2:

public Player(int initialGoals, int initialGames)
{
this(initialGames, initialGoals, 0, 'X');
}

您无法使用相同的参数类型定义构造函数。在这种情况下,我认为您应该使用第一个构造函数 设置器,而不是仅使用一个参数定义许多构造函数。

public class Player  {
   private int games; 
   private int goals;
   private int assists;
   private char position;
   public Player() {
    games = 0;
    goals = 0;
    assists = 0;
    position = 'X';
   }
   public Player(int initialGames, int initialGoals, int initialAssists, 
   char initialPosition ) {
       games = initialGames;
       goals = initialGoals;
       assists = initialAssists;
       position = initialPosition;
   }
   // SETTER
   public void setGames (int games) {
      this.games = games;
   }
   public void setGoals (int goals) {
      this.goals= goals;
   }
}

,然后:

Player playerA = new Player();
playerA.setGames(1);
Player playerB = new Player();
playerB.setGoals(2);