首页 > 解决方案 > 从放置在 ArrayList 问题中的同一父类继承的对象

问题描述

有代码:

public class Piece {
    boolean isWhite;

    public Piece(boolean isWhite) {
        this.isWhite = isWhite;
    }
}


public class Bishop extends Piece {
    public Bishop(boolean isWhite) {
        super(isWhite);
    }
}

因此,如果我创建 2 个匿名实例Bishop并为它们设置isWhite不同的值,它们就会拥有它。

System.out.println(new Bishop(true).isWhite); // prints true
System.out.println(new Bishop(false).isWhite); // prints false

但是当我将它们放入 ArrayList 时,其中的每个实例都将具有isWhite第一个匿名类,如果它只调用一次的话。IE

List<Piece> pieces = new ArrayList<Piece>();
pieces.add(new Bishop(true));
pieces.add(new Bishop(false));

for (Piece p : pieces) {
    System.out.println(p.isWhite); // prints true for both, as first was set
}

如果我也创建引用,就会发生这种情况,即

Bishop b1 = new Bishop(true);
Bishop b2 = new Bishop(false);

pieces.add(b1);
pieces.add(b2);

for (Piece p : pieces) {
    System.out.println(p.isWhite) // prints true for the both
}

所以我不知道为什么会发生这种情况=(

标签: javaarraylist

解决方案


好的,看了你的src,你这里有错误。你在白色的部分上循环两次

public void paintPieces(Graphics g) {
    for (Piece piece : whitePieces) {
        g.drawImage(whitePiecesImages.get(piece.getType()), getXCoord(piece.getX()), getYCoord(piece.getY()), null);
        System.out.println(piece.isWhite());
    }

    for (Piece piece : whitePieces) {
        g.drawImage(blackPiecesImages.get(piece.getType()), getXCoord(piece.getX()), getYCoord(piece.getY()), null);
        System.out.println(piece.isWhite());
    }
}

所以是的,isWhite()对于 System.out 中的黑色部分,所有这些都会告诉你真实的情况。

最后一个循环应该是:

 for (Piece piece : blackPieces) 

所以你的 JVM 可以一直喝,没问题


推荐阅读