Java构造函数将不接受正确的参数

Java构造函数将不接受正确的参数,java,constructor,Java,Constructor,我正在尝试为一个基于文本的游戏制作一个构造器,我只是为了好玩,但无法让角色构造器使用字符串和int。使用时,它只需要一个字符 public class Character { public int attack, rangedAttack, manaAttack, defense, rangedDefense, manaDefense, strength, agility, intelligence ,race; String name; public Character(String Na

我正在尝试为一个基于文本的游戏制作一个构造器,我只是为了好玩,但无法让
角色
构造器使用
字符串
int
。使用时,它只需要一个
字符

public class Character {

public int attack, rangedAttack, manaAttack, defense, rangedDefense, manaDefense, strength, agility, intelligence ,race;
String name;

public Character(String Name, int Race) {
    name = Name;
    race = Race; 
};
这就是我尝试使用构造函数的地方

public class QuestOfVallock{

public static void main(String[] args){
       Character self = new Character();
}

使用参数定义构造函数时,默认构造函数将不再可用,直到您显式声明它:

因此,您应该添加此构造函数:

public Character(){ /* do something */ }

或者调用正确的构造函数。请记住,Java没有参数的默认值。

当您使用参数定义构造函数时,默认构造函数将不再可用,直到您显式声明它:

因此,您应该添加此构造函数:

public Character(){ /* do something */ }

或者调用正确的构造函数。记住Java没有参数的默认值。

当您使用如下参数定义自己的构造函数时

public Character(String Name, int Race) {
    name = Name;
    race = Race; 
}
public Person(String name)
{
   name = name;  
}
Java不会为您设置一个默认构造函数,它是未定义的。您需要自己实现它

编辑1:

Java中的变量命名甚至参数都应该是驼峰式的

编辑2:

有时我们定义一个setter方法或构造函数,它们的参数名(变量名)在实例变量上也是相同的。请看一个例子

public class Person
{
   private String name; // <-- 

   public Person(String name) // <--
   {

   }

   public void setName(String name)
   {

   }
}
好吧,这让人困惑。Java将给您一个警告,在变量赋值中没有任何效果,我们也可能认为
name
(实例)被赋值了一个新值

要解决此问题,请使用此。


当您使用如下参数定义自己的构造函数时

public Character(String Name, int Race) {
    name = Name;
    race = Race; 
}
public Person(String name)
{
   name = name;  
}
Java不会为您设置一个默认构造函数,它是未定义的。您需要自己实现它

编辑1:

Java中的变量命名甚至参数都应该是驼峰式的

编辑2:

有时我们定义一个setter方法或构造函数,它们的参数名(变量名)在实例变量上也是相同的。请看一个例子

public class Person
{
   private String name; // <-- 

   public Person(String name) // <--
   {

   }

   public void setName(String name)
   {

   }
}
好吧,这让人困惑。Java将给您一个警告,在变量赋值中没有任何效果,我们也可能认为
name
(实例)被赋值了一个新值

要解决此问题,请使用此。


它看起来像是与的命名空间冲突

尝试声明一个包以避免歧义,或者将字符类重命名为其他名称

package mygame;
public class Character {

    public int attack, rangedAttack, manaAttack, defense, rangedDefense, manaDefense, strength, agility, intelligence ,race;
    String name;

    public Character(String name, int race) {
        this.name = name;
        this.race = race; 
    }
}
然后像这样实例化角色类:

mygame.Character self = new mygame.Character("John Doe", 1);

更新:正如其他人所指出的,如果定义了一个或多个构造函数,Java不会为您创建默认构造函数(一个没有参数的构造函数)。但我仍然坚持我的答案,即一揽子计划才是前进的方向。不鼓励使用默认包,它只适用于开始开发的小型应用程序。请参见

它看起来像与的命名空间冲突

尝试声明一个包以避免歧义,或者将字符类重命名为其他名称

package mygame;
public class Character {

    public int attack, rangedAttack, manaAttack, defense, rangedDefense, manaDefense, strength, agility, intelligence ,race;
    String name;

    public Character(String name, int race) {
        this.name = name;
        this.race = race; 
    }
}
然后像这样实例化角色类:

mygame.Character self = new mygame.Character("John Doe", 1);
更新:正如其他人所指出的,如果定义了一个或多个构造函数,Java不会为您创建默认构造函数(一个没有参数的构造函数)。但我仍然坚持我的答案,即一揽子计划才是前进的方向。不鼓励使用默认包,它只适用于开始开发的小型应用程序。首先请参见


避免使用名称
Character
,因为
java.lang
包中有一个名为
Character
的类,它是基本数据类型
char
的包装类
java.lang.Character
类用于自动装箱转换


将该类重命名为
Champion
,它肯定会工作。:)

第三
您没有向参数传递正确的参数。构造函数需要参数,而将参数留空

它看起来像什么 因此,您的
main()
如下所示:

public static void main(String[] args){
       Champion self = new Champion("Little Java Child",RaceConstants.JAVA_CHILD; //<-- Unique race
}
publicstaticvoidmain(字符串[]args){
Champion self=新冠军(“小爪哇孩子”,racesconstants.Java_Child;//第一名
避免使用名称
Character
,因为
java.lang
包中有一个名为
Character
的类,它是基本数据类型
char
的包装类
java.lang.Character
类用于自动装箱转换


将该类重命名为
Champion
,它肯定会工作。:)

第三
您没有向参数传递正确的参数。在将参数留空时,构造函数需要参数

它看起来像什么 因此,您的
main()
如下所示:

public static void main(String[] args){
       Champion self = new Champion("Little Java Child",RaceConstants.JAVA_CHILD; //<-- Unique race
}
publicstaticvoidmain(字符串[]args){

Champion self=new Champion(“小Java孩子”,racesconstants.Java_Child;//您定义了一个以字符串和int作为参数的构造函数,您必须用以下方式调用它:

Character self = new Character("Bobby the mighty elf", 1);
如果未定义构造函数,则不能调用没有参数的构造函数,除非未在类中定义另一个构造函数

此外:

  • 不要定义名为
    Character
    的类,因为它已经是包java.lang中一个重要类的名称
  • 对变量(参数或成员变量)使用更好的命名约定:它们不应该大写,而应该使用camelCase
  • <> LI>最好将变量封装为私有的,使用GETT/SETER访问它们。如果它们是常数(在对象生存期内不会改变),则可以考虑将它们变成“公共最终”或只定义吸气剂而不是SETTER。
您定义了一个以字符串和int作为参数的构造函数,您必须这样调用它: