class Number {
int mark;
}
class One extends Number {
mark = 1; //error: variable mark not initiated.
}
这是因为我必须在方法中使用它:
int getMark( Number n) {
return n.Mark;
//returns 1 if Object passed is of "One" class
}
那么为什么第一个代码的第5行显示错误。
编辑:错字,只是“数字”。
答案 0 :(得分:3)
子类中的初始化代码需要在构造函数,方法或初始化程序块中发生。像这样的东西(使用构造函数):
class One extends Number {
public One() {
mark = 1;
}
}
或像这样(使用初始化程序块):
class One extends Number {
{
mark = 1;
}
}
有关详细信息,请参阅Java教程主题Initializing Fields。 (顺便说一下,Number
是一个可怕的类名,因为它与java.lang
中的每个Java程序隐式导入的类名冲突。)
然而,将mark
的初始化放在Number
的代码中会更好,因为将字段的管理保持在与其相同的类中是一种很好的编程习惯。被宣布。这可以通过为Number
:
class Number {
int mark;
/** Explicit initialization constructor */
Number(int mark) {
this.mark = mark;
}
/** Default constructor (perhaps not needed?) */
Number() {
// assign default value to mark (if 0 is not a good default)
}
}
class One extends Number {
One() {
super(1); // calls the explicit initialization constructor
}
}
最后,您还应该考虑哪些访问说明符(public
,protected
或private
)是合适的。
至于引用方法getMark
中的变量,问题是mark
与Mark
不同。在变量名称方面,Java区分大小写。重写方法以正确引用变量:
int getMark( Number n) {
return n.mark;
//returns 1 if Object passed is of "One" class
}
我还建议将getMark()
作为Number
类的方法,而不是外部方法。然后,您可以使用n.getMark()
代替getMark(n)
来获取mark
的当前值。然后,您可以将mark
声明为private
(也可能是final
),因为encapsulation和immutability在OOP中始终是好事。