无法找到符号方法错误

时间:2013-12-01 03:39:21

标签: java file inheritance methods

我有一个来自我的Java 1类的作业(我是初学者),这个问题指示我们使一些代码更加面向对象。我已经完成了我可以完成的任务,但是我的一个文件始终给我一个Cannot Find Symbol Method错误,即使文件在同一个项目中也是如此。我知道方法在那里,所以发生了什么?该错误仅发生在AlienPack中,它似乎无法识别其他文件,所有这些文件都在同一个项目中(包括AlienPack)。找不到getDamage()中调用的AlienPack方法(位于SnakeAlienOgreAlien等)。

编辑:我试图在getDamage()中调用的AlienPack方法的新错误是仍未找到方法。 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);
} }

SnakeAlien:

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

OgreAlien:

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

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

AlienDriver:

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

}}

2 个答案:

答案 0 :(得分:1)

两个问题:

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

应该只是

pack[i].getDamage() ...

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

...然而

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

Alien

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

另一种方法是在每个点投射到相应的子类,因为你知道它是什么:

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

然而(再次)即使这是错误的。您无法将+=应用于“右值”。你需要做的是:

  1. 同时在setDamage()中声明Alien摘要并执行pack[i].setDamage(pack[i].getDamage()+damage);
  2. 如果施法,((SnakeAlien)pack[i]).setDamage( ((SnakeAlien)pack[i].getDamage()) + damage);
  3. 我的建议:

    在外星人中:

    public abstract class Alien {
        ...
        private int damage = 0; // Move damage up to the abstract base class
        public int addToDamage(int n) { this.damage += n; }
        ...
    }
    

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

答案 1 :(得分:0)

我认为至少部分问题是getClass()方法。你期望它返回一个对象,但事实并非如此。只需直接调用数组。

pack[I].getDamage()

应该假设正确类型的对象存储在pack()