2017-04-13 109 views
0

我在添加我的子类:Martian和Saturner到驱动程序中的ArrayList时遇到问题。将子类添加到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")); 

} 

我加入更多的细节,这个职位,因为它主要是代码,但是这是雷尔无关,我只是打字,因为我有这是无关紧要的。我的问题很简单明了,代码也不多,我不认为问题很坦白。

+0

给我们提供实际的编译器错误。 – Alexander

+0

错误说 “AlienDriver.java.60:错误:无法找到符号 alienList.add(新火星(” Hookrah “)); 符号:类火星 位置:类AlienDriver 1错误” –

回答

1

所有的类都是抽象类,所以它们不能被实例化。 你的情况:覆盖Alien子类中的invade()方法并删除'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 

希望有所帮助。

+0

从删除摘要关键词超类和子类?并通过实现invade()你的意思是这样的“public abstract class Saturner extends Alien implements invade()”? –

+0

@KelOkekpe:没有。查看你的代码,有几个错误。首先,你必须把所有的类(Alien及其子类)移出AlienDriver。因为在java中,文件中只有一个公共类,所以从其他类(AlienDriver除外)中删除“public”关键字。其次,从火星人和星期六消除“抽象”关键字,因为你想从外星人中扩展它们。最后,覆盖每个Alien子类的抽象方法invade()。 – bryannguyen

+0

谢谢,从子类中删除公众做了这份工作,谢谢Karen –

0

也许我失去了它,但它似乎您试图使用一个构造函数有一个参数

new Martian("Hookrah") 

但是你定义构造函数有5个参数

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

} 

编辑:

继续我们在评论中的讨论,这里是应该工作的示例代码

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

的输出是:

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文件夹的默认包中。

+0

我解决了这个问题,但我不认为这就是我得到错误的原因。 –

+0

我不能评论其他答案,因为我没有足够的声望。但是与删除摘要有关,它看起来像这样:公共类Martian extends Alien public Martian(String p,String v,String n,String s,String a) {p,v,n ,S,A); } \t @Override \t无效入侵(){ \t \t //入侵的实现,因为它不是在外国人基类实现了它必须在扩展任何类来实现它 \t \t \t} }' – R4N

+0

我这样做,但我仍然得到同样的错误...我除了超类的一切删除了抽象的字,但我仍然无法将子类添加到驱动程序中的ArrayList。 –

相关问题