【问题标题】:Java how to set child class instance variable with super class constructorJava如何使用超类构造函数设置子类实例变量
【发布时间】:2020-07-27 23:17:45
【问题描述】:

我有一个包含两个实例变量colorposition 的子类。构造函数接受这两个。我首先调用包含setColor(color)->this.color = colorsuper(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);
    }
}

!Here's a picture of debugging information1

【问题讨论】:

  • Rook 是否也定义了一个名为color 的字段?我猜你有一个名为color 的阴影字段。不幸的是,您的屏幕截图没有显示足够的代码来确定。你也没有发布一个最小的、可重复的例子。所以我只能猜测。
  • @ElliottFrisch 抱歉缺少信息,Rook 和 GenericPiece 都有相同的 2 个实例变量:颜色和位置

标签: java inheritance constructor superclass


【解决方案1】:

颜色字段应该只是父类的一部分,不能在子类中重复。继承是关于shared state,所以颜色将被Rock类型继承,并且具有公共或受保护的访问权限。

【讨论】:

  • 在超类中是只使用公共访问还是只使用受保护访问?还是无关紧要?
  • 您应该遵循最小权限原则。这意味着应为成员分配程序运行所需的最低可访问性。如果不相关的类需要访问,请将其公开。如果只有子类需要访问并且是唯一受信任的..让它受到保护。
猜你喜欢
  • 2018-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-06
  • 2019-05-29
  • 2015-02-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多