Java 更改子类中的变量值?
我已经有一段时间没有用Java做过任何事情了,而且我用它做任何事情的经验都非常有限,大多数情况下我都是用更高级的指定语言、脚本语言之类的语言编写的 我假设我不理解指定类成员的默认值背后的概念Java 更改子类中的变量值?,java,Java,我已经有一段时间没有用Java做过任何事情了,而且我用它做任何事情的经验都非常有限,大多数情况下我都是用更高级的指定语言、脚本语言之类的语言编写的 我假设我不理解指定类成员的默认值背后的概念 // parent public class A { protected int value = 0; public void print() { System.out.println(value); } } // child class public class
// 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++中,声明为代码>虚拟<代码> >,这可以被一个子类重写。谢谢!