【发布时间】:2014-06-19 22:34:11
【问题描述】:
我对 private 字段与抽象类的 private static 字段的范围感到困惑。例如,考虑以下类并注意字段validator,
abstract class ValidComponent {
private static Validator validator = ... //(statement to instantiate new Validator)
/**
* This method is to be used by subclasses in their factory-methods
* to do some validation logic after instantiation.
*/
protected void selfValidate() {
//validation logic
...
validator.validate(this); // <<< This line uses the validator
...
}
}
class ValidUsername extends ValidComponent {
private @NotEmpty String core;
private ValidUsername(String unamestr) {
this.core = unamestr;
}
/** This is the factory-method who use selfValidate() */
public static ValidUsername create(String unamestr) {
ValidUsername vuname = new ValidUsername(unamestr);
vuname.selfValidate();
return vuname;
}
}
class ValidEmail extends ValidComponent {
private @Email String core;
private ValidEmail(String emailstr) {
this.core = emailstr;
}
/** This is the factory-method who use selfValidate() */
public static ValidEmail create(String emailstr) {
ValidEmail vemail = new ValidEmail(emailstr);
vemail.selfValidate();
return vemail;
}
}
抽象类ValidComponent准备方法selfValidate(),其中使用了private static字段validator。
ValidUsername 和 ValidEmail 是说明其基类意图的子类:方法 selfValidate() 在其工厂方法中用于验证自身。
如果我的理解是正确的,当vuname.selfValidate()和vemail.selfValidate()被调用时,两者都使用相同的Validator对象,即ValidComponent.validator。
但是如果我碰巧将validator 的修饰符从private static 更改为仅private,Validor 对象在vuname.selfValidate() 和vemail.selfValidate() 中使用的对象仍然是同一个对象吗?强>
【问题讨论】:
-
private static无法从课堂外访问。
标签: java static field abstract-class private