Java 更改子类中的变量值?

Java 更改子类中的变量值?,java,Java,我已经有一段时间没有用Java做过任何事情了,而且我用它做任何事情的经验都非常有限,大多数情况下我都是用更高级的指定语言、脚本语言之类的语言编写的 我假设我不理解指定类成员的默认值背后的概念 // parent public class A { protected int value = 0; public void print() { System.out.println(value); } } // child class public class

我已经有一段时间没有用Java做过任何事情了,而且我用它做任何事情的经验都非常有限,大多数情况下我都是用更高级的指定语言、脚本语言之类的语言编写的

我假设我不理解指定类成员的默认值背后的概念

// parent
public class A {
    protected int value = 0;
    public void print() {
        System.out.println(value);
    }
}

// child class
public class B extends A {
    int value = 1;
}
简而言之,创建B的实例并调用print()将打印A中设置的“value”的原始值

我假设a上定义的函数的“value”上下文与B完全不同,而不是作为“此对象拥有的名为“value”的变量”的某种通用标识符

还有什么其他方法可以组织某个类的常见变体,但创建该类的子类?某种工厂物品?接口似乎不是答案,因为我必须重新定义类的每一个方面,所以这样做没有任何好处


非常感谢您的帮助。

子类字段不会覆盖超类字段

可以通过构造函数设置默认值,如下所示

// parent
public class A {
    private int value = 0;
    public A( int initialValue ) {
        value = initialValue;
    }

    public void print() {
        System.out.println(value);
    }
}

// child class
public class B extends A {
    public B() {
       super( 1 );
    }
}
此外,在大多数情况下,如果您避开受保护的字段,您的生活会更轻松

受保护的字段打开您的数据,以便其他类直接访问和修改,其中一些类您可能无法控制。不良的封装可能会导致错误并抑制修改。正如报告中所建议的:

“使用对特定成员有意义的最严格访问级别。除非有充分理由不使用,否则请使用private。”


@用户2038045-好问题

您困惑的根源在于,在Java中,子类可以重写方法。。。但不能覆盖成员变量

如果您的类B有自己的“print()”方法,您将看到预期的行为。B.print()将覆盖A.print()

如果您的类B有任何其他访问“value”的方法,您将再次看到预期的行为。B.value将隐藏A.value,而B.someOtherMethod()将访问B.value

但在您的情况下,您调用了A.print()。。。它访问一个.value

详情如下:


B
中声明
是在
A
中隐藏
值。您需要为
B
创建一个构造函数,并在那里设置
value=1
。有关详细信息,请参阅。字段隐藏不是这个问题的罪魁祸首。使用字段隐藏,B.value将隐藏A.value。相反,OP得到的是A.value,而期望的是B.value。我想知道
A.this.value
B.this.value
是否有效。“在大多数情况下,如果你避开受保护的字段,你的生活会更轻松。”这可能是真的,但可能值得更多的解释。@dnault-补充说明。谢谢你的主意。这几乎是我在几分钟的摆弄后得出的结论。我不喜欢在对象创建过程中必须设置值的概念,因为我习惯于在子类中重新定义成员,而只是重写这些值,但是这似乎是面向对象范式所要求的(我认为C++不允许你重写)。感谢输入。在java和C++中,替代品包括:1)在超类中定义受保护的或公共的SETTER方法,2)定义和一致地使用一个GETTER方法(C++中,声明为代码>虚拟<代码> >,这可以被一个子类重写。谢谢!