Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 找不到符号方法错误_Java_File_Inheritance_Methods - Fatal编程技术网

Java 找不到符号方法错误

Java 找不到符号方法错误,java,file,inheritance,methods,Java,File,Inheritance,Methods,我有一个Java 1类的作业(我是初学者),这个问题指导我们使一些代码更加面向对象。我已经为作业做了我能做的,但是我的一个文件始终给我一个找不到符号方法错误,即使这些文件在同一个项目中。我知道方法是有的,怎么回事?该错误仅出现在AlienPack中,它似乎无法识别其他文件,所有这些文件都在同一个项目中(包括AlienPack)。在AlienPack中调用的getDamage()方法找不到(它在SnakeAlien,OgreAlien等中) 编辑:我试图在AlienPack中调用的getDamag

我有一个Java 1类的作业(我是初学者),这个问题指导我们使一些代码更加面向对象。我已经为作业做了我能做的,但是我的一个文件始终给我一个
找不到符号方法
错误,即使这些文件在同一个项目中。我知道方法是有的,怎么回事?该错误仅出现在
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; }
        ...
    }