如何创建一个继承的静态对象

时间:2012-01-06 20:10:17

标签: java inheritance static polymorphism

是否可以在子类中创建一个静态对象? 澄清:

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
}

是否可以这样或类似的东西?

3 个答案:

答案 0 :(得分:3)

静态方法在Java中不能是抽象的或虚拟的(当你考虑Java通过vtable调度的方式时这是有意义的)。你应该做的是创建一个实例,并使其成为一个单例。

考虑到访问load()的方式,您不需要多态行为。也许你的真实案例更复杂,但你的代码片段并不表示需要多态性。

答案 1 :(得分:2)

不,抽象或虚拟静态方法没有意义 - 但你也不需要它。只需从load()中删除抽象DataPacket方法,代码就会按预期运行。

为什么使用虚拟静态方法没有意义?因为静态方法总是通过类引用调用,而不是通过对象引用调用。尽管可以编写foo.staticMethod(),其中foo是声明类型Foo的变量,但您实际上正在调用Foo.staticMethod(),即使foo确实引用了SubclassOfFoo到{{1}}的实例。

如果你真的需要根据某个对象的实际类型调用静态方法(而不是引用该对象的变量的声明类型),你需要创建一个非静态方法来调用相应的静态方法,并在子类中覆盖它。

答案 2 :(得分:0)

静态方法不可继承,因为它们属于类而不属于单个对象。因此代码不会编译。