java - 找不到符号方法错误

标签 java file inheritance methods

我的 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/

相关文章:

ruby-on-rails - 单表继承和 ActiveRecord 关联

java - 我怎样才能在java中获取文件名和路径?

java - 如何在hibernate 3中执行存储过程

php - 使用 php 和 mysql 上传多个文件?

javascript - 如何为大型项目从基于对象的语言迁移到服务器端 Node.js Javascript?

Java,类类型列表

java - jackson 将额外的字段反序列化为 map

java - 如何从 Java 使用 WinInet API?

c - 我的链表未填充 C

c++ - C++ 中的 .dat ASCII 文件 I/O