[英]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.