gpt4 book ai didi

java - 找不到符号方法错误

转载 作者:行者123 更新时间:2023-12-01 13:46:47 24 4
gpt4 key购买 nike

我的 Java 1 类(class)有一项作业(我是初学者),该问题指示我们使一些代码更加面向对象。我已经为作业做了我能做的,但我的一个文件始终给我一个无法找到符号方法错误,即使这些文件位于同一个项目中。我知道方法在那里,那么发生了什么?该错误仅发生在 AlienPack 中,它似乎无法识别其他文件,所有这些文件都位于同一项目中(包括 AlienPack)。未找到在 AlienPack 中调用的 getDamage() 方法(位于 SnakeAlienOgreAlien 中,等)。

编辑:我尝试在 AlienPack 中调用的 getDamage() 方法的新错误是仍然找不到这些方法。 AlienDriver 也找不到 calculateDamage()

这是我到目前为止得到的代码:

外星人:

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 SnakeAlien 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 SnakeAlien() {
super();
setDamage(0); }

public SnakeAlien(String n, int h, int d) {
super(n, h);
setDamage(d); }

public SnakeAlien(SnakeAlien anAlien) {
super(anAlien);
setDamage(anAlien.getDamage()); }

public SnakeAlien clone() {
return new SnakeAlien(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);
} }

MarshmallwManAlien:

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

外星人包:

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

外星人驱动程序:

public class AlienDriver { // driver class
public static void main(String[] args) {

Alien[] group = new Alien[5];
group[0]= new SnakeAlien("Bobby", 100, 10);
group[1]= new OgreAlien("Timmy", 100, 6);
group[2]= new MarshmallowManAlien("Tommy", 100, 1);
group[3]= new OgreAlien("Ricky", 100, 6);
group[4]= new SnakeAlien("Mike", 100, 10);

System.out.println(group.calculateDamage());

} }

最佳答案

两个问题:

pack[i].getClass().getDamage() ...

应该只是

pack[i].getDamage() ...

您似乎对 getClass() 方法的作用感到困惑。它返回一个代表另一个对象的类(即java.lang.Class)的对象。它用于反射。要调用 getDamage(),您只需直接在 pack[i] 上调用它,如上所示。

但是...

您正在尝试使用Alien类型的引用调用方法getDamage(),该类型是所有具体外星人类型的基类。如果你想这样做的话getDamage() 需要在基类中声明 abstract,以便在通过 Alien 调用它时可以找到它并将其分派(dispatch)到正确的子类引用。

外星人中:

public abstract class Alien {
...
public abstract int getDamage();

另一种方法是在每个点强制转换为适当的子类,因为您知道它是什么:

((SnakeAlien)pack[i]).getDamage() +=damage;

然而(再次)即使这样也是错误的。您不能将 += 应用于“右值”。您需要在这里做的是:

  1. 同时在 Alien 中声明 setDamage() 抽象并执行 pack[i].setDamage(pack[i].getDamage()+damage);
  2. 如果施放,((SnakeAlien)pack[i]).setDamage( ((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; }
...
}

在您的驱动程序中,无需测试该类。对 Alien 引用调用 addToDamage() 方法。

关于java - 找不到符号方法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20308458/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com