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个实例变量:颜色和位置在超类中只使用公共访问还是只使用受保护的访问?还是无关紧要?你应该遵循最小特权原则。这意味着应该为成员分配程序工作所需的最低可访问性。如果不相关的类需要访问,请将其公开。如果只有子类类需要访问并且是唯一受信任的类,请将其设置为受保护。