Java如何用超类构造函数设置子类实例变量

Java如何用超类构造函数设置子类实例变量,java,inheritance,constructor,superclass,Java,Inheritance,Constructor,Superclass,我有一个子类,它有两个实例变量color和position。构造函数接受这两种。我首先调用super(color)构造函数,它包含setColor(color)->this.color=color。根据调试工具,这是为调用该方法的超类而不是子类设置this.color。这不是使用超类构造函数设置实例变量的正确方法吗 Rook.java: public Rook(String color, Position pos) { super(color); // at this point

我有一个子类,它有两个实例变量
color
position
。构造函数接受这两种。我首先调用
super(color)
构造函数,它包含
setColor(color)
->
this.color=color
。根据调试工具,这是为调用该方法的超类而不是子类设置
this.color
。这不是使用超类构造函数设置实例变量的正确方法吗

Rook.java:

public Rook(String color, Position pos) {
    super(color);
    // at this point this.color == null (for Rook)
    initPosition(pos);
}
GenericPiece.java:

public GenericPiece(String color) {
    setColor(color);
    // at this point this.color == "white" (for GenericPiece)
}

public void setColor(String color) throws InvalidPieceColorError {
    if (Color.checkValid(color)) {
        this.color = color;
    } else {
        throw new InvalidPieceColorError(color);
    }
}

颜色字段只能是父类的一部分,不能在子类中重复。继承是关于
共享状态的
,因此颜色将由
Rock
类型继承,并具有公共或受保护的访问权限。

Rook是否也定义了名为
color
的字段?我猜您有一个名为
color
的阴影字段。不幸的是,您的屏幕截图没有显示足够的代码来确定。你也没有发布一个最小的,可复制的例子。所以我只能猜测。@ElliottFrisch很抱歉,缺少信息,Rook和GenericPiece都有相同的2个实例变量:颜色和位置在超类中只使用公共访问还是只使用受保护的访问?还是无关紧要?你应该遵循最小特权原则。这意味着应该为成员分配程序工作所需的最低可访问性。如果不相关的类需要访问,请将其公开。如果只有子类类需要访问并且是唯一受信任的类,请将其设置为受保护。