【问题标题】:Trouble adding subclass to ArrayList向 ArrayList 添加子类时遇到问题
【发布时间】:2017-09-09 23:05:29
【问题描述】:

我在将我的子类:火星和土星添加到驱动程序中的 ArrayList 时遇到问题。

我收到一个“找不到符号错误”,这可能是什么原因?

import java.util.*;
import java.io.*;
abstract class Alien
{
    private String planet;
    private String venus;
    private String name;
    private String skinColor;
    private String alienClass;

public Alien(String planet, String venus, String name, String skinColor, String alienClass)
{
    this.planet=planet;
    this.venus=venus;
    this.name=name;
    this.skinColor=skinColor;
    this.alienClass=alienClass;
}


abstract void invade();

public String toString()
{
    return name + "has" + skinColor + "skin, and is apart of the " + alienClass + "class" ;
}

public abstract class Martian extends Alien
{
    public Martian(String p, String v, String n, String s, String a)
    {
        super(p,v,n,s,a);

    }
}

public abstract class Saturner extends Alien
{
    public Saturner(String p, String v, String n, String s, String a)
    {
        super(p,v,n,s,a);
    }

        abstract void invade();
        {
            System.out.println("The aliens are invading: ");
        }
}

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


    ArrayList<Alien> alienList = new ArrayList<>();

    alienList.add(new Martian("Hookrah"));

}

这无关紧要 我在这篇文章中添加了更多细节,因为它主要是代码,但这真的无关紧要,我只是输入这个,因为我必须这样做。我的问题简洁明了,代码不多,老实说我看不出问题。

【问题讨论】:

  • 给我们实际的编译器错误。
  • 错误提示“AlienDriver.java.60: error: cannot find symbol alienList.add(new Martian("Hookrah")); symbol: class Martian location: class AlienDriver 1 error”

标签: inheritance arraylist subclass extends


【解决方案1】:

你所有的类都是抽象类,所以它们不能被实例化。 在您的情况下:覆盖 Alien 子类中的入侵()方法并删除“抽象”关键字。

public class AlienDriver { // only one class have 'public' keyword in a file
    public static void main(String[] args){
        // do your stuff
    }
}

abstract class Alien {
    // constructor
    ...
    abstract void invade(); // abstract method
}

class Martian extends Alien {
    // constructor
    ...
    @Override
    void invade() {
        // do something such as print line
    }
}

// Same for Saturner

希望有所帮助。

【讨论】:

  • 从超类和子类中删除抽象关键字?并通过实施入侵()你的意思是像这样“公共抽象类土星扩展外星人实施入侵()”?
  • @KelOkekpe:不。查看您的代码,有几个错误。首先,您必须将所有类(Alien 及其子类)移出 AlienDriver。因为在java中,一个文件中只有一个公共类,所以从其他类中删除'public'关键字(除了AlienDriver)。其次,从 Martian 和 Saturner 中删除“abstract”关键字,因为您想从 Alien 中扩展它们。最后,为每个 Alien 子类重写抽象方法invailing()。
  • 哇,谢谢,从子类中删除 public 完成了这项工作,谢谢凯伦
【解决方案2】:

也许我错过了它,但您似乎正在尝试使用带有一个参数的构造函数

new Martian("Hookrah")

但是你定义的构造函数需要 5 个参数

public Martian(String p, String v, String n, String s, String a)
{
    super(p,v,n,s,a);

}

编辑:

继续我们在 cmets 中的讨论,下面是应该可以工作的示例代码

外星人.java

abstract class Alien
{
private String planet;
private String venus;
private String name;
private String skinColor;
private String alienClass;

public Alien(String planet, String venus, String name, String skinColor, String alienClass)
{
    this.planet=planet;
    this.venus=venus;
    this.name=name;
    this.skinColor=skinColor;
    this.alienClass=alienClass;
}


abstract void invade();
public String toString()
{
    return name + " has " + skinColor + " skin, and is apart of the " + alienClass + " class" ;
}
}

火星人.java

public class Martian extends Alien
{
public Martian(String p, String v, String n, String s, String a)
{
    super(p,v,n,s,a);

}

@Override
void invade() {
    // TODO Auto-generated method stub

}
}

Saturner.java

public class Saturner extends Alien
{
public Saturner(String p, String v, String n, String s, String a)
{
    super(p,v,n,s,a);
}

    void invade()
    {
        System.out.println("The aliens are invading: ");
    }
}

AlienDriver.java

import java.util.ArrayList;

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


    ArrayList<Alien> alienList = new ArrayList<>();

    alienList.add(new Martian("MarPlanet", "MarVenus", "MarName", "MarSkinColor", "MarAlienClass"));
    alienList.add(new Saturner("SatPlanet", "SatVenus", "SatName", "SatSkinColor", "SatAlienClass"));
    for (Alien al : alienList) {
        System.out.println("Class of Object: " + al.getClass().getName() + " || description = " + al.toString());
    }
}
}

输出是:

Class of Object: Martian || description = MarName has MarSkinColor skin, and is a part of the MarAlienClass class
Class of Object: Saturner || description = SatName has SatSkinColor skin, and is a part of the SatAlienClass class

我不确定您是否使用 IDE(如 Eclipse),但我强烈推荐它来帮助调试。在本例中,所有这些类都在 src 文件夹的同一个默认包中。

【讨论】:

  • 我解决了这个问题,但我不认为这是我收到错误的原因。
  • 我无法评论其他答案,因为我没有足够的声誉。但与删除摘要有关,它看起来像这样public class Martian extends Alien { public Martian(String p, String v, String n, String s, String a) { super(p,v,n,s,a); } @Override void invade() { // invade implementation since it's not implemented in the Alien base class it must be implemented in any class that extends it } }
  • 我这样做了,但我仍然遇到同样的错误...我从除超类之外的所有内容中删除了抽象一词,但我仍然无法将子类添加到驱动程序中的 ArrayList .
  • @KelOkekpe 我添加了显示每个不同类和输出的示例代码,如果您对此有任何疑问,请告诉我。
  • 我使用了你发布的代码,现在我得到的错误是告诉我“类 Martian 是公共的,应该在名为 Martian.java 的文件中声明”它对 Saturner 表示相同类... 我保存了这段代码的 Martian.java 和 Saturner.java 版本,并尝试在 AlienDriver.java 下运行它,但无济于事。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-05
  • 2014-03-23
  • 1970-01-01
  • 2014-05-18
  • 2013-03-11
  • 1970-01-01
  • 2011-06-10
相关资源
最近更新 更多