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條經驗 獲得超7個贊
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";
}
添加回答
舉報