我开始学习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);