【问题标题】:Java Constructor will not take correct argumentsJava 构造函数不会接受正确的参数
【发布时间】:2013-01-27 06:33:45
【问题描述】:

我正在尝试为我正在制作的基于文本的游戏创建一个构造函数,但无法让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();
}

【问题讨论】:

  • 我认为代码不会编译(类定义)
  • 嗯,会不会和java自带的Character类冲突?
  • 你没有默认构造函数,为什么不带任何参数调用它?
  • 你得到什么错误信息?
  • 已经解决了,谢谢!

标签: java constructor


【解决方案1】:

看起来像是与 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?

【讨论】:

  • 错了,兄弟!!构造函数不以分号; 结尾。另外,您缺少 } 类的右大括号 :)
  • @LittleChild 你可以看出我没有编译我的代码。我只是把我的答案直接写到了文本框中。我修正了语法并在底部添加了另一段。我希望它是令人满意的。
  • 我也没有编译代码,但是……没关系。无意冒犯:)
【解决方案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.&lt;variable name&gt;

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

【讨论】:

    【解决方案3】:

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

    第二
    将该类重命名为Champion,它肯定会起作用。 :)

    第三
    您没有将正确的参数传递给参数。当您将括号留空时,您的构造函数需要参数

    长什么样子

    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
    



    我还建议让你的Raceinterface 中添加一些常量
    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
    }
    

    【讨论】:

      【解决方案4】:

      还要注意...

      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...
      

      【讨论】:

        【解决方案5】:

        你定义了一个以 String 和 int 作为参数的构造函数,你必须这样调用它:

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

        如果你没有定义一个构造函数,你就不能调用没有参数的构造函数,除非你没有在类中定义另一个构造函数。

        还有:

        • 不要定义名为 Character 的类,因为它已经是包 java.lang 中一个重要类的名称。
        • 对变量(参数或成员变量)使用更好的命名约定:它们不应大写,而应使用驼峰命名法。
        • 最好通过将变量设为私有来封装变量并使用 getter/setter 访问它们。如果它们是常量(在对象生命周期内不会改变),您可以考虑将它们设为“public final”或只定义 getter,而不定义 setter。

        【讨论】:

          【解决方案6】:

          当你定义一个带参数的构造函数时,默认构造函数不再可用,直到你显式声明它:

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

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

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

          【讨论】:

            猜你喜欢
            • 2016-09-03
            • 1970-01-01
            • 2013-02-23
            • 1970-01-01
            • 2014-02-09
            • 1970-01-01
            • 1970-01-01
            • 2011-01-10
            • 2019-05-27
            相关资源
            最近更新 更多