Java 为继承的字段添加特定值

Java 为继承的字段添加特定值,java,inheritance,subclass,private,superclass,Java,Inheritance,Subclass,Private,Superclass,我在继承方面遇到了一些问题(这里是学生)。我需要能够为我创建的每个子类使用1个继承的私有字段。显然,子类不能访问继承的字段,但是当创建新对象时,继承的私有字段是该对象的一部分。但出于我的目的,每个子类都需要为继承的字段具有自己的特定值。我的第一次尝试如下所示: Public class A { private int x = 0; public A(int n) { x = n; } public int useX() {

我在继承方面遇到了一些问题(这里是学生)。我需要能够为我创建的每个子类使用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?
}

然而,我的教授告诉我,我也可以在我的超类中使用setter方法来创建这个新字段,从那里我感到困惑。有人能帮我指出正确的方向吗

普通JavaBean为其字段提供
public
访问器和变异器(也称为getter和setter)。但是,您可以提供一个受保护的设置程序。大概

public class A {
    private int x = 0;

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

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

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

,一个普通的Java Bean为它的字段提供了
公共
访问器和变异器(也称为getter和setter)。但是,您可以提供一个受保护的设置程序。大概

public class A {
    private int x = 0;

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

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

然后
B.getX()
(或者
B.useX()
,如果你真的喜欢的话)将返回
1
,你发布的代码没有编译(在
B
C
中没有
n
,在
super
之前你不能做任何事情)。如果你能解决这个问题,我认为你的方法是正确的。使用构造函数是一种很好的初始化值的方法,而不需要对值进行不必要的无限制访问。我修正了你发布的代码不能编译的问题(在
B
C
中没有
n
,在
super
之前你不能做任何事情)。如果你能解决这个问题,我认为你的方法是正确的。使用构造函数是一种很好的初始化值的方法,而不需要对值进行不必要的无限制访问。我修复了
A
没有无参数构造函数的问题,因此
super()
没有参数就无法工作。@resueman说得不错。移除显式构造函数;在我的例子中当然不需要它。所以我现在的一个问题是,如果我在B类中设置x(x),在C类中设置x(y),它们会改变一个类的值还是它们各自的类的值?只针对各自的实例;该类在这两种情况下都不会更改。
A
没有无参数构造函数,因此
super()
在没有参数的情况下无法工作。@reseeman很有道理。移除显式构造函数;在我的例子中当然不需要它。所以我现在的一个问题是,如果我在B类中设置x(x),在C类中设置x(y),它们会改变一个类的值还是它们各自的类的值?只针对各自的实例;无论哪种情况,班级都不会改变。