我正在尝试为基于文本的游戏制作一个构建器,我正在制作这个游戏,并且无法让Character
构造函数获取String
和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();
}
答案 0 :(得分:3)
你定义了一个构造函数,它接受一个String和一个int作为参数,你必须用这种方式调用它:
Character self = new Character("Bobby the mighty elf", 1);
如果没有参数,则不能在没有参数的情况下调用构造函数,除非您没有在类中定义另一个构造函数。
此外:
Character
的类,因为它已经是java.lang包中一个重要类的名称。答案 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
}