5 回答
TA贡献1848条经验 获得超2个赞
这样的常量不能,因为字段在类的所有实例(包括所有子类的实例)之间共享。下面介绍如何将其实现为非静态常量:staticstatic
public abstract class Foo {
public final String name; // Particular value to be defined in subclass
protected Foo (String name) {
this.name = name;
}
}
public class Bar extends Foo {
public Bar () {
super ("Zoo"); // Here we define particular value for the constant
}
}
顺便说一句,不是接口的一部分。serialVersionUIDSerializable
TA贡献1936条经验 获得超6个赞
serialVersionUID接口不会强制执行字段存在,因为接口无法强制执行字段的存在。你可以声明一个实现的类,它将编译得很好,没有字段在那里。SerializableSerializableserialVersionUID
检查字段在工具中是硬编码的。一个例子是JDK java.io.ObjectStreamClass.getSerialVersionUID()方法,它通过反射加载值:serialVersionUIDserialVersionUID
/**
* Returns explicit serial version UID value declared by given class, or
* null if none.
*/
private static Long getDeclaredSUID(Class<?> cl) {
try {
Field f = cl.getDeclaredField("serialVersionUID");
int mask = Modifier.STATIC | Modifier.FINAL;
if ((f.getModifiers() & mask) == mask) {
f.setAccessible(true);
return Long.valueOf(f.getLong(null));
}
} catch (Exception ex) {
}
return null;
}
TA贡献1828条经验 获得超13个赞
这是我发现的模拟它的最佳方法。Javadoc 防止防止有点不好扩展...但是id子类没有NAME,它将无法执行
public abstract class Foo {
protected final String NAME;
public Foo() {
String name="";
try {
name = (String) this.getClass().getDeclaredField("NAME").get(name);
} catch (NoSuchFieldException
| SecurityException
| IllegalArgumentException
| IllegalAccessException e) {
e.printStackTrace();
}
NAME = name;
}
}
public class Bar extends Foo {
public static final String NAME = "myName";
}
添加回答
举报