1

我正在尝试为我正在制作的基于文本的游戏制作一个构造函数,并且无法让Character构造函数采用Stringand int。使用时只需要一个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();
}
4

6 回答 6

3

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

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

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

还:

  • 不要定义一个名为的类,Character因为它已经是包 java.lang 中一个重要类的名称。
  • 对变量(参数或成员变量)使用一些更好的命名约定:它们不应该大写,而是使用驼峰命名法。
  • 最好通过将变量设为私有并使用 getter/setter 来访问它们来封装您的变量。如果它们是常量(在对象生命周期内不会改变),您可以考虑将它们设为“public final”或仅定义 getter,而不定义 setter。
于 2013-02-12T02:05:37.030 回答
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(instance) 被赋值了一个新值。

解决问题使用this.<variable name>

public Person(String name)
{
   this.name = name;  
}
于 2013-02-12T02:04:30.500 回答
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 不会为您创建默认构造函数(一个没有参数的构造函数)。但我仍然坚持我的回答,即包裹是要走的路。不鼓励使用默认包,仅适用于开始开发的小型应用程序。请参阅使用 Java 的默认包是一种不好的做法吗?

于 2013-02-12T02:04:49.213 回答
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...
于 2013-02-12T02:09:02.053 回答
0

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

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

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

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

于 2013-02-12T02:04:21.913 回答
0

首先
避免使用该名称Character,因为java.lang包中有一个已命名的类Character,它是原始数据类型的包装类char
该类java.lang.Character用于自动装箱转换,更多信息在这里

其次
将该类重命名为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
}
于 2013-02-12T02:05:22.060 回答