自从我从事任何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”的原始值。
我假设不是“这个对象拥有的一个名为'value'的变量的某种通用标识符,”A上的已定义函数与“B”具有完全不同的“值”上下文。
还有什么其他方法可以组织某个类的常见变体但是创建所述类的孩子?某种工厂对象?它似乎不是接口是答案,因为我必须重新定义该类的每个方面,所以我没有做到这一点。
非常感谢任何帮助,谢谢。
答案 0 :(得分:6)
子类字段不会覆盖超类字段。
您可以通过构造函数设置默认值,如下所示。
// 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 );
}
}
此外,在大多数情况下,如果避开受保护的字段,您的生活将会更轻松。
受保护的字段会打开您的数据,以便直接访问和修改其他类,其中一些类可能无法控制。较差的封装可能允许错误并抑制修改。正如Java tutorials on access control中所述:
“使用对特定成员有意义的最严格的访问级别。除非您有充分的理由不使用私有,否则请使用私有。”
答案 1 :(得分:4)
@ user2038045 - 好问题。
令人困惑的是,在Java中,子类可以覆盖方法 ...但不能覆盖成员变量。
如果你的B级有自己的" print()"方法 - 您可以看到您期望的行为。 B.print()将覆盖 A.print()。
如果您的B级有任何其他方法可以访问" value",您再次看到您预期的行为。 B.value将隐藏 A.value,而B.someOtherMethod()将访问B.value。
但在你的情况下,你调用A.print()...来访问A.value。
以下是更多详情: