繁体   English   中英

构造函数已经在类中定义

[英]Constructor is already defined in class

我开始学习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错误:类Player中已经定义了构造函数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';
    }

只有一个构造函数,并在参数不可用时传递零。

对于前

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM