为什么不能使用array的元素调用其方法?

时间:2019-01-27 07:11:23

标签: java arrays object methods

public class Main {
    public static void main(String[] args) {
        Object[] array = new Object[1];
        Piece piece = new Piece();
        array[0] = piece;
        array[0].move();
    }
}

class Piece{
    public void move(){
        System.out.println("hello");
    }
}

第6行不起作用,我不确定为什么。 array [0] 不应该给我 piece piece.move() 调用类中的方法?

3 个答案:

答案 0 :(得分:1)

在将Piece添加到Object数组中时,您将其转换为Object。

尝试一下:

public class Main {
    public static void main(String[] args) {
        Piece[] array = new Piece[1];
        Piece piece = new Piece();
        array[0] = piece;
        array[0].move();
    }
}

class Piece{
    public void move(){
        System.out.println("hello");
    }
}

答案 1 :(得分:1)

这是因为在array[0] = piece;行上您将Piece对象分配给Object,这是有效的,因为Object是所有对象的父类。

但是,当您执行array[0].move();时,您尝试从move()类的引用中调用Object方法。 这是不可能的,因为move()类中没有声明Object方法。

因此,您需要像下面这样投射:

((Piece)array[0]).move();

答案 2 :(得分:1)

Piece存储为Object时,编译器不再知道它是Piece。您必须明确地告诉它(将其广播((Piece)array[0]).move();)。
或者将对象存储在Piece[] array中。

我认为真正的动机是存储不同的作品类型。在这种情况下,它们都必须具有相同的基本类型。这可以通过使所有片段类型扩展相同的基类或实现公共接口来实现:

public class Main {
    public static void main(String[] args) {
        Movable[] array = new Movable[2];
        APiece aPiece = new APiece();
        BPiece bPiece = new BPiece();
        array[0] = aPiece;
        array[0].move();
        array[1] = bPiece;
        array[1].move();
    }
}

interface Movable {
    void move();
}

class APiece implements Movable{
    @Override
    public void move(){
        System.out.println("APiece moved ");
    }
}

class BPiece implements Movable{
    @Override
    public void move(){
        System.out.println("BPiece moved ");
    }
}