如果我创建一个抽象对象数组,我可以将不同类型的子项放在同一个数组中吗?

时间:2014-02-09 09:18:22

标签: java arrays object abstract

例如:

abstract class Shape { 
    public abstract void move();
}

class Circle extends Shape { ... }
class Square extends Shape { ... } 

...

Shape[] shapes = new Shape[10];
shapes[0] = new Circle();
shapes[1] = new Square();

...

for (Shape i: shapes) 
    i.move();

我试过这样做,理论上似乎没问题,但是当我尝试运行它时,我一直收到一个未知错误(“线程中的异常”主“java.lang.Error:未解决的编译问题”)。在运行它之前,它给了我这些奇怪的错误警告:“{在此标记之后预期。”我仔细检查了所有的括号都没问题。我应该只使用界面还是其他东西?

编辑:我修好了,但它对我来说仍然没有意义。错误在于:

Shape[] shapes = new Shape[2];
shapes[0] = new Circle();
shapes[1] = new Square();

我把它更改为:

Shape[] shapes = new Shape[2];
{
shapes[0] = new Circle();
shapes[1] = new Square();
}

突然间它起作用了。什么?

编辑2:没关系。我在一个方法之外初始化了数组。

2 个答案:

答案 0 :(得分:2)

Eclipse有一个“功能”,您可以在其中运行无法编译的代码。我强烈建议你不要使用它,因为它只会延迟发现错误(最大化修复它们的成本)

当您关闭此功能时,您将找到未编译的代码行,并且可能与使用子类没有任何关系。

简而言之,你可以做到这一点,错误可能是不相关的。

答案 1 :(得分:0)

仅在声明时允许在方法外部(在类级别)初始化变量。

所以你可以在方法之外调用它:

Shape[] shapes = new Shape[2];

但你不能在方法之外调用它:

shapes[0] = new Circle();
shapes[1] = new Square();