Inheritance 向ArrayList添加子类时遇到问题

Inheritance 向ArrayList添加子类时遇到问题,inheritance,arraylist,subclass,extends,Inheritance,Arraylist,Subclass,Extends,我很难将我的子类:Martian和Saturner添加到驱动程序中的ArrayList中 我得到一个找不到符号的错误,有什么原因可以解释这可能是什么原因吗 import java.util.*; import java.io.*; abstract class Alien { private String planet; private String venus; private String name; private String skinColor;

我很难将我的子类:Martian和Saturner添加到驱动程序中的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"));

}
这无关紧要
我在这篇文章中添加了更多的细节,因为它主要是代码,但这与实际情况无关,我之所以键入这篇文章,是因为我必须这样做。我的问题很清楚,也很简洁,代码也不多,老实说,我不认为问题出在哪里。

所有的类都是抽象类,所以它们不能被实例化。 在您的例子中:覆盖外来子类中的invaive方法并删除'abstract'关键字

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

希望对您有所帮助。

也许我没有看到它,但您似乎试图使用一个只接受一个参数的构造函数

new Martian("Hookrah")
但你定义的构造函数有5个参数

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

}
编辑:

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

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" ;
}
}
Martian.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());
    }
}
}

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

给出实际的编译器错误。错误为AlienDriver.java.60:错误:找不到符号alienst.addnew MartianHookrah;符号:类火星位置:类AlienDriver 1错误从超类和子类中删除抽象关键字?说到实现入侵,你的意思是像这个公共抽象类Saturner扩展了Alien implements Invact吗?@KelOkekpe:不是。看看你的代码,有几个错误。首先,您必须将所有Alien类及其子类移出AlienDriver。因为在java中,一个文件中只有一个公共类,所以从AlienDriver之外的其他类中删除“public”关键字。第二,从火星人和土星人中删除“抽象”关键字,因为你们想从外星人中扩展它们。最后,覆盖每个外来子类的抽象方法入侵。哇,谢谢,从子类中删除public完成了工作,谢谢你,KarenI解决了这个问题,但我不认为这是我出错的原因。我不能评论其他答案,因为我没有足够的声誉。但与删除抽象相关的是,它看起来类似于这个公共类Martian extends异形{public Martian String p,String v,String n,String s,String a{super,v,n,s,a;}@Override void invain{//INVATE实现因为它不是在外来基类中实现的,所以它必须在扩展它的任何类中实现}我这样做了,但仍然得到了相同的错误…我从除超类之外的所有内容中删除了单词abstract,但我仍然无法将子类添加到驱动程序中的ArrayList。@KelOkekpe我添加了显示每个不同类的示例代码,如果您对它有任何疑问,输出会告诉我。我使用了您提供的代码osted,现在我得到的错误是告诉我类Martian是公共的,应该在一个名为Martian.java的文件中声明,Saturner类也是如此……我保存了一个Martian.java和一个Saturner.java版本的代码,并尝试在AlienDriver.java下运行它,但没有成功。
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