是否可以在子类中创建一个静态对象? 澄清:
abstract class DataPacket {
public static boolean loaded = false;
public abstract static boolean load();// Returns true if it loads. Returns false if already loaded
}
class DataPacket1 extends DataPacket {
public static boolean load() {
if (!loaded) {
// Load data
loaded = true;
return loaded;
}
return false;
}
}
class DataPacket2 extends DataPacket {
public static boolean load() {
if (!loaded) {
// Load data
loaded = true;
return loaded;
}
return false;
}
}
main() {
DataPacket1.load();// returns true
DataPacket1.load();// returns false
DataPacket2.load();// returns true
}
是否可以这样或类似的东西?
答案 0 :(得分:3)
静态方法在Java中不能是抽象的或虚拟的(当你考虑Java通过vtable调度的方式时这是有意义的)。你应该做的是创建一个实例,并使其成为一个单例。
考虑到访问load()
的方式,您不需要多态行为。也许你的真实案例更复杂,但你的代码片段并不表示需要多态性。
答案 1 :(得分:2)
不,抽象或虚拟静态方法没有意义 - 但你也不需要它。只需从load()
中删除抽象DataPacket
方法,代码就会按预期运行。
为什么使用虚拟静态方法没有意义?因为静态方法总是通过类引用调用,而不是通过对象引用调用。尽管可以编写foo.staticMethod()
,其中foo
是声明类型Foo
的变量,但您实际上正在调用Foo.staticMethod()
,即使foo
确实引用了SubclassOfFoo
到{{1}}的实例。
如果你真的需要根据某个对象的实际类型调用静态方法(而不是引用该对象的变量的声明类型),你需要创建一个非静态方法来调用相应的静态方法,并在子类中覆盖它。
答案 2 :(得分:0)
静态方法不可继承,因为它们属于类而不属于单个对象。因此代码不会编译。