【问题标题】:Adding specific values for inherited fields为继承的字段添加特定值
【发布时间】:2016-07-17 11:45:44
【问题描述】:

我在继承方面遇到了一些麻烦(这里是学生)。我需要能够为我创建的每个子类使用 1 个继承的私有字段。显然,子类不能访问继承的字段,但是当创建新对象时,继承的私有字段是该对象的一部分。出于我的目的,尽管每个子类都需要为该继承字段具有自己的特定值。我的第一次尝试看起来像这样:

Public class A {

    private int x = 0;

    public A(int n) {

        x = n;
    }

    public int useX() {

        return x;
    }
}

Public class B Extends A {
    int n = 1;

    public B() {
        super(n);
    }

    useX(); // Return 1?
}

Public class C Extends A {
    int n = 2;

    public B() {
        super(n);
    }

    useX(); // Return 2?
}

但是我的教授告诉我,我也可以在我的 Super 类中使用 setter 方法来创建新字段,从那里我很困惑。谁能帮我指出正确的方向?

【问题讨论】:

  • 您发布的代码无法编译(BC 中没有n,在super 之前您无法执行任何操作)。如果你解决这个问题,我认为你的方法是正确的。使用构造函数是一种初始化值的好方法,无需对值进行不必要的无限制访问。
  • 我刚刚在声明中省略了 int 。我修好了

标签: java inheritance subclass private superclass


【解决方案1】:

一个普通的 Java Bean 提供了 public accessorsmutators(又名 getterssetters)。字段。但是,您可以提供一个 protected 设置器。有点像,

public class A {
    private int x = 0;

    public int getX() { // <-- the usual name.
        return x;
    }

    protected void setX(int x) {
        this.x = x;
    }
}

然后您的子类可以调用该设置器

public class B extends A {
    public B() {
        super();
        setX(1);
    }
}

然后B.getX()(或B.useX(),如果您真的更喜欢)将返回1

【讨论】:

  • A 没有无参数构造函数,所以 super() 没有参数就无法工作。
  • @resueman 好点。删除了显式构造函数;我的例子当然不需要它。
  • 所以我现在的一个问题是,如果我要在 B 类中设置 X(x) 并在 C 类中设置 X(y),它们会更改 A 类的值还是它们的值?各自的班级?
  • 仅适用于各自的实例class 在任何一种情况下都不会改变。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-02
相关资源
最近更新 更多