Java构造函数不会采用正确的参数

时间:2013-02-12 02:02:11

标签: java constructor

我正在尝试为基于文本的游戏制作一个构建器,我正在制作这个游戏,并且无法让Character构造函数获取Stringint。使用时,只需要char

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

6 个答案:

答案 0 :(得分:3)

你定义了一个构造函数,它接受一个String和一个int作为参数,你必须用这种方式调用它:

Character self = new Character("Bobby the mighty elf", 1);

如果没有参数,则不能在没有参数的情况下调用构造函数,除非您没有在类中定义另一个构造函数。

此外:

  • 不要定义名为Character的类,因为它已经是java.lang包中一个重要类的名称。
  • 对变量(参数或成员变量)使用一些更好的命名约定:它们不应大写,而是使用camelCase。
  • 最好通过将变量设为私有来封装变量,并使用getter / setter来访问变量。如果它们是常数(在对象生命期内不会改变),你可以考虑将它们作为“公共最终”或仅定义吸气剂,而不是定位器。

答案 1 :(得分:2)

使用像

这样的参数定义自己的构造函数时
public Character(String Name, int Race) {
    name = Name;
    race = Race; 
}

Java不会为您设置默认构造函数,并且未定义。你需要自己实现它。

修改1:

Java中的变量命名偶数参数应该是驼峰式的

编辑2:

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

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

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

   }

   public void setName(String name)
   {

   }
}

当你做这样的作业时

public Person(String name)
{
   name = name;  
}

那令人困惑。 Java会向您发出一个警告,即在变量赋值中没有任何影响,我们可能会认为name(实例)被赋予了新值。

要解决此问题,请使用this.<variable name>

public Person(String name)
{
   this.name = name;  
}

答案 2 :(得分:2)

它看起来像是与java.lang.Character的命名空间冲突。

尝试声明一个包以避免歧义或将Character类重命名为其他类。

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

然后像这样实例化你的Character类:

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

更新:正如其他人所指出的,如果您定义了一个或多个构造函数,Java不会为您创建默认构造函数(没有参数的构造函数)。但我仍然坚持我的答案,包装是要走的路。不鼓励使用默认包,仅适用于开始开发的小型应用程序。见Is the use of Java's default package a bad practice?

答案 3 :(得分:1)

另请注意......

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; 
    } //<-- shouldn't have semicolon here...
} //<-- should match the braces for the class...

答案 4 :(得分:0)

使用参数定义构造函数时,默认构造函数不再可用,直到您明确声明它为止:

所以你应该添加这个构造函数:

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

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

答案 5 :(得分:0)

<强>第一
避免使用名称Character,因为java.lang包中有一个名为Character的类,它是原始数据类型char的包装类。
java.lang.Character类用于自动装箱转换,more info here

<强>第二
将该类重命名为Champion,它肯定会有效。 :)

<强>第三
你没有将适当的参数传递给参数。当您将parantheses留空时,构造函数需要参数

它看起来像什么

public class Character {//<-- avoid this name

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

public Character(String Name, int Race) {
    name = Name;
    race = Race; 
};//<-- Y U PUT SEMICOLON ?  

public class QuestOfVallock{

public static void main(String[] args){
       Character self = new Character(); //<-- Y U NO GIVE HIM PARAMETERS ?
}    

应该是什么

public class Champion { //<-- Java-approved name

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

public Character(String Name, int Race) {
    name = Name;
    race = Race; 
}//<-- No semicolon
}//<-- Closing brace for class

public class QuestOfVallock{

public static void main(String[] args){
       Champion self = new Champion("Little Java Child",1001); //<-- Unique race
}
}//<-- closing brace for class



我还建议您在Race

中制作interface个常量
public interface RaceConstants {
    int ELF = 1;
    int JAVA_CHILD = 1001;
    int DWARF = 2;
}  

所以你的main()看起来像这样:

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