Java 构造函数已在类中定义
我开始学习java,正在编写一个简单的曲棍球统计类。看起来是这样的:Java 构造函数已在类中定义,java,Java,我开始学习java,正在编写一个简单的曲棍球统计类。看起来是这样的: public class Player { private int games; private int goals; private int assists; private char position; public Player() { games = 0; goals = 0; assists = 0;
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';
}
}
现在,在我输入最后一个块的代码之前,所有这些都可以正常编译。当我试图编译它时,我得到以下错误:
java:52错误:已在类Player中定义构造函数playerlint
我做错了什么?我非常严格地遵循教科书的格式来建立这个课程,但我一直遇到这个错误。有谁能告诉我为什么会这样?因为我不完全理解此编译器错误。您复制了构造函数,编译器无法决定在键入new Player8时要调用哪一个构造函数: 尝试从一组新的方法调用新的播放器
static Player NewPlayerFromGoals(int initialGoals){...}
static Player NewPlayerFromGames(int initialGames){...}
并称之为
Player p = Player.NewPlayerFromGoals(8);
如果复制了构造函数,则编译器无法决定在键入new Player8时要调用哪一个构造函数: 尝试从一组新的方法调用新的播放器
static Player NewPlayerFromGoals(int initialGoals){...}
static Player NewPlayerFromGames(int initialGames){...}
并称之为
Player p = Player.NewPlayerFromGoals(8);
及
拥有相同的签名玩家。
因此,您应该更改或删除构造函数
编辑我添加更多的代码来澄清
方法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');
}
及
拥有相同的签名玩家。
因此,您应该更改或删除构造函数
编辑我添加更多的代码来澄清
方法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 initialGoals)
{
games = 0;
goals = initialGoals;
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
你没有适当地超载 您有两个具有相同签名的构造函数
public Player(int initialGoals)
{
games = 0;
goals = initialGoals;
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
不允许具有相同参数的多个构造函数。创建多个构造函数时,让一个主构造函数使用每个可能的参数构建一个对象。如果允许使用较少的参数创建对象,则创建另一个调用主构造函数的构造函数
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 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 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 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);
不能使用相同的参数类型定义构造函数。在这种情况下,我认为应该使用第一个构造函数+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);
您定义了两次构造函数public Playerint initialGames检查您的代码,更好地说明不能有两个具有相同参数类型的构造函数。有两个,一个int参数,无论名称public Playerint initialGames和public Playerint initialGoals本质上都是相同的构造函数-类型保持不变,名称也不重要您定义了两次构造函数public Playerint initialGames检查代码,最好说不能有两个具有相同参数类型的构造函数。所以你有两个带一个int参数的构造函数,不管名称public Playerint initialGames和public Playerint initialGoals本质上是同一个构造函数-类型保持不变,名称不重要所以如果我想要两者,我必须把它们放在同一个构造函数中?@DavidM我只是用一些示例代码编辑了我的答案。所以如果我想要两者,我必须把它们放在同一个构造函数中?@DavidM我刚刚用一些示例代码编辑了我的答案。