Java中抽象类的继承

Java中抽象类的继承,java,inheritance,polymorphism,abstract-class,abstract,Java,Inheritance,Polymorphism,Abstract Class,Abstract,我想做一个简单的继承实例,在互联网上有很多关于它的信息,但在我的例子中我就是无法理解 public abstract class Board { private Block [][] board; /** * creates and empty board */ public Board(){ board = new Block[6][6]; //init board

我想做一个简单的继承实例,在互联网上有很多关于它的信息,但在我的例子中我就是无法理解

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..
问题是,我想使用来自超类构造函数的初始化,以及它的所有其他函数,但我想让place函数特定于StandartBoard。我应该如何定义变量“board”,这样我就可以使用和修改来自超类的相同变量


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

如果您使用
受保护
修饰符而不是
私有
设置
,那么您可以直接访问它,就像您建议的那样。 另一种方法(不一定反映正确的实践),也如您所述,是为它定义一个
getter

public Block[][] getBoard(){
    return board;
}
关于您的评论,是的,
protected
具有包范围的访问权限。没有子类,只有修饰符。Java最初有这样一个修饰符。它是受私有保护的,但在Java 1.0中被删除了


如果您希望模拟这种设计,您可以使用
受保护的
修饰符,并强制规定只有父类及其子类在同一个包中。

如果您使用
受保护的
修饰符而不是
私有的
设置
,那么您可以直接访问它,就像您建议的那样。 另一种方法(不一定反映正确的实践),也如您所述,是为它定义一个
getter

public Block[][] getBoard(){
    return board;
}
关于您的评论,是的,
protected
具有包范围的访问权限。没有子类,只有修饰符。Java最初有这样一个修饰符。它是受私有保护的,但在Java 1.0中被删除了


如果希望模拟这种设计,可以使用
protected
修饰符,并强制要求只有父类及其子类在同一个包中。

您已经正确地从Oracle读取了该表

protected
意味着可以从同一包中的任何类(即使不是子类)和不同包中的子类访问该字段。这可能不是您想要的-默认访问(无修改器)可能比使用
protected
更可取

没有修饰符意味着只有子类可以访问它

您最好保持
线路板
私有
,并确保所有更改线路板的方法都将线路板保持在一致状态。由于数组是可变的,因此可以为单个条目而不是整个数组提供
public
getter

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

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

您已经正确地从Oracle读取了该表

protected
意味着可以从同一包中的任何类(即使不是子类)和不同包中的子类访问该字段。这可能不是您想要的-默认访问(无修改器)可能比使用
protected
更可取

没有修饰符意味着只有子类可以访问它

您最好保持
线路板
私有
,并确保所有更改线路板的方法都将线路板保持在一致状态。由于数组是可变的,因此可以为单个条目而不是整个数组提供
public
getter

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

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

“我不能用受保护的设备直接访问线路板”
-是。你试过这么做吗?你的示例代码中可能有输入错误<在'bord[i][j]中的code>bord。某物;`应该是
board
?是的,我读过:)我读到有了protected,每个人都可以访问它(不仅是子类,还有包中的所有类)。还是我对oracle的表格理解错了?我想要这种类型的访问,所以只有这个子类能够修改它。
“我不能用protected直接访问它”
-是。你试过这么做吗?你的示例代码中可能有输入错误<在'bord[i][j]中的code>bord。某物;`应该是
board
?是的,我读过:)我读到有了protected,每个人都可以访问它(不仅是子类,还有包中的所有类)。还是我对oracle的表格理解错了?我想要这种类型的访问,所以只有这个子类能够修改它。在这种情况下,我不会在数组上使用公共getter,因为它公开了数组引用,现在,您的
Board
类不能再保证
Board
对象处于有效状态,因为任何可以读取该Board的人现在都可以修改Board中的任何元素。将
board
设置为
protected
是将其公开给子类的最佳方式。在括号中添加了一条关于此的注释protected意味着只有子类可以访问它,而没有其他类可以访问它?(不是包中的其他类等)@Mladia我扩展了我的答案,以解决在这种情况下issueI不会在数组上使用公共getter的问题,因为它公开了数组引用,现在,您的
Board
类不能再保证
Board
对象处于有效状态,因为任何可以读取该Board的人现在都可以修改Board中的任何元素。将
board
设置为
protected
是将其公开给子类的最佳方式。在括号中添加了一条关于此的注释protected意味着只有子类可以访问它,而没有其他类可以访问它?(不是包中的其他类等)@Mladia我扩展了我的答案来解决这个问题