Java 找不到符号方法错误
我有一个Java 1类的作业(我是初学者),这个问题指导我们使一些代码更加面向对象。我已经为作业做了我能做的,但是我的一个文件始终给我一个Java 找不到符号方法错误,java,file,inheritance,methods,Java,File,Inheritance,Methods,我有一个Java 1类的作业(我是初学者),这个问题指导我们使一些代码更加面向对象。我已经为作业做了我能做的,但是我的一个文件始终给我一个找不到符号方法错误,即使这些文件在同一个项目中。我知道方法是有的,怎么回事?该错误仅出现在AlienPack中,它似乎无法识别其他文件,所有这些文件都在同一个项目中(包括AlienPack)。在AlienPack中调用的getDamage()方法找不到(它在SnakeAlien,OgreAlien等中) 编辑:我试图在AlienPack中调用的getDamag
找不到符号方法
错误,即使这些文件在同一个项目中。我知道方法是有的,怎么回事?该错误仅出现在AlienPack
中,它似乎无法识别其他文件,所有这些文件都在同一个项目中(包括AlienPack
)。在AlienPack
中调用的getDamage()
方法找不到(它在SnakeAlien
,OgreAlien
等中)
编辑:我试图在AlienPack
中调用的getDamage()
方法的新错误是仍然找不到这些方法AlienDriver
也找不到CalculatedImage()
以下是我目前掌握的代码:
外国人:
public class Alien {
// instance variables
private String name;
private int health;
// setters
public void setName(String n) {
name = n; }
public void setHealth(int h) {
if(h>0&&h<=100) {
health = h;
} else {
System.out.println("Error! Invalid health value!");
System.exit(0); } }
// getters
public String getName() {
return name; }
public int getHealth() {
return health; }
// constructors
public Alien() {
setName("No name");
setHealth(100); }
public Alien(String n, int h) {
setName(n);
setHealth(h); }
public Alien(Alien anAlien) {
setName(anAlien.getName());
setHealth(anAlien.getHealth()); }
public Alien clone() {
return new Alien(this);
} }
奥格雷安:
public class OgreAlien extends Alien { // new file
// instance variables
private int damage;
// setters
public void setDamage(int d) {
if(d>0) {
damage = d;
} else {
System.out.println("Error! Invalid damage value!");
System.exit(0); } }
// getters
public int getDamage() {
return damage; }
// constructors
public OgreAlien() {
super();
setDamage(0); }
public OgreAlien(String n, int h, int d) {
super(n, h);
setDamage(d); }
public OgreAlien(OgreAlien anAlien) {
super(anAlien);
setDamage(anAlien.getDamage()); }
public OgreAlien clone() {
return new OgreAlien(this);
} }
棉花糖:
public class MarshmallowManAlien extends Alien { // new file
// instance variables
private int damage;
// setters
public void setDamage(int d) {
if(d>0) {
damage = d;
} else {
System.out.println("Error! Invalid damage value!");
System.exit(0); } }
// getters
public int getDamage() {
return damage; }
// constructors
public MarshmallowManAlien() {
super();
setDamage(0); }
public MarshmallowManAlien(String n, int h, int d) {
super(n, h);
setDamage(d); }
public MarshmallowManAlien(MarshmallowManAlien anAlien) {
super(anAlien);
setDamage(anAlien.getDamage()); }
public MarshmallowManAlien clone() {
return new MarshmallowManAlien(this);
} }
AlienPack:
public class AlienPack { // new file, this one isn't recognizing the others
// instance variables
private Alien[] pack;
// setters
public void setPack(Alien[] aliens) {
pack = new Alien[aliens.length];
for(int i = 0; i<aliens.length; i++) {
pack[i]=aliens[i].clone(); } }
// getters
public Alien[] getPack() {
Alien[] temp = new Alien[pack.length];
for(int i = 0; i<pack.length; i++) {
temp[i]=pack[i].clone(); }
return temp; }
// constructors
public AlienPack() {
Alien[] nothing = new Alien[1];
nothing[0]=null;
setPack(nothing); }
public AlienPack(Alien[] aliens) {
setPack(aliens);}
// other methods
public int calculateDamage() {
int damage = 0;
for(int i = 0; i<pack.length; i++) {
if((new SnakeAlien()).getClass()==pack[i].getClass()) {
pack[i].getDamage() +=damage;
} else if((new OgreAlien()).getClass()==pack[i].getClass()) {
pack[i].getDamage() +=damage;
} else if((new MarshmallowManAlien()).getClass()==pack[i].getClass()) {
pack[i].getDamage() +=damage;
} else {
System.out.println("Error! Invalid object!");
System.exit(0); } }
return damage; } }
}}我认为您的问题至少有一部分是getClass()
方法。您希望它返回一个对象,但它没有返回。直接调用数组即可
pack[I].getDamage()
假设在pack()中存储了正确类型的对象,则应该可以正常工作。两个问题:
pack[i].getClass().getDamage() ...
应该是公正的
pack[i].getDamage() ...
您似乎对getClass()
方法的作用感到困惑。它返回一个表示另一个对象的类(即java.lang.class
)的对象。它用于反射。要调用getDamage()
只需在pack[i]
上直接调用它,如上所示
然而
您正试图使用类型为Alien
的引用调用方法getDamage()
,该引用是所有具体的Alien类型的基类。如果你想这样做,
getDamage()
需要在基类中声明abstract
,以便在通过Alien
引用调用它时可以找到它并将其分派到正确的子类
在<代码>外星人
:
public abstract class Alien {
...
public abstract int getDamage();
另一种方法是在每个点上强制转换到适当的子类,因为您知道它是什么:
((SnakeAlien)pack[i]).getDamage() +=damage;
然而(再一次)即使这样也是错误的。不能将+=
应用于“右值”。您在这里需要做的是:
setDamage()
在Alien
中抽象并执行pack[i].setDamage(pack[i].getDamage()+damage)代码>
((蛇形外星人)包[i]).setDamage(((蛇形外星人)包[i].getDamage())+伤害)代码>
public abstract class Alien {
...
private int damage = 0; // Move damage up to the abstract base class
public int addToDamage(int n) { this.damage += n; }
...
}
在驱动程序中,无需测试类。调用
Alien
引用上的addToDamage()
方法。发布整个错误。删除getClass()后,我得到一个“意外类型”错误。此外,生成外来抽象会导致重写的clone()方法无法工作。编译器说clone()方法无法实例化。类型转换包[i]给了我一个“意外类型”的编译器错误,你的第二个解决方案让编译器说“+”运算符不能应用于SnakeAlien,int。我的老师是一个坚持使用我们知道的,并且只使用到目前为止我们在课堂上知道的东西的人,所以我不能使用abstract.OK,根据我最后的建议,您不需要将基类抽象化。我不明白。我是否在调用getDamage()方法的地方调用addToDamage()方法?要以现在的方式更新损坏值,必须检索当前损坏,添加增量,然后将更新后的损坏重新保存到对象中。我的建议是编写一个方法,在单个操作中实现这一点。您隐藏了该方法的复杂性,为“客户机”程序提供了一种更干净、更简单的操作方式。通过将其放入超类,您只需实现一次。
((SnakeAlien)pack[i]).getDamage() +=damage;
public abstract class Alien {
...
private int damage = 0; // Move damage up to the abstract base class
public int addToDamage(int n) { this.damage += n; }
...
}