Java 中抽象 class 的继承

Inheritance with abstract class in Java

我想做一个简单的继承实例,网上有很多资料,但我就是看不懂。

public abstract class Board {       
    private Block [][] board;               
    /**
     * creates and empty board
     */
    public Board(){
        board = new Block[6][6];

        //init board
        for(int i = 0; i<board.length ...

    }

    public abstract place(int x, int y, int type);

    public void otherFunction1();

    etc..

还有我的childclass

public class StandartBoard extends Board{

    public int place(int type, int x, int y) {
        bord[i][j].something;
    }

问题是,我想使用来自超级 class 的构造函数的初始化以及它的所有其他函数,但我希望 place 函数特定于 StandartBoard。我该如何定义变量 "board",以便我可以使用和修改来自超级 class.

的相同变量

我知道一种方法是使用 sets 和 gets,但我不能直接使用 protected 或其他方式访问它......

如果您使用 protected 修饰符而不是 private 设置 board,那么您可以像您建议的那样直接访问它。 另一种方法(不一定反映正确的做法),也如您所说,是为它定义一个getter

public Block[][] getBoard(){
    return board;
}

关于您的评论,是的,protected 具有包范围的访问权限。没有 subclasses-only 修饰符。 Java本来就有这样的修饰语。它是 private protected,但在 Java 1.0 中被删除了。

如果你想模仿这样的设计,你可以使用 protected 修饰符并强制只有父 class 和它的子 class 在同一个包中。

您已正确阅读来自 Oracle 的 table。

protected表示可以从同一个包中的anyclass访问该字段(即使不是subclass) 来自不同包中的子classes。这可能不是您想要的 - 默认访问(无修饰符)可能比使用 protected 更可取。

没有修饰符表示只有个子class可以访问它。

您最好保持 board private 并确保所有更改它的方法都保持一致的状态。由于数组是 mutable,您可以为单个条目提供 public getter 而不是整个数组

public Block getBlockAt(int i, int j) {
    return board[i][j];
}

这样您就可以从任何地方读取电路板,而无需从任何地方更改电路板。