Как сделать унаследованный статический объект - PullRequest
1 голос
/ 07 января 2012

Возможно ли сделать статический объект в родительском классе, который будет иметь подклассы? Разъяснение:

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 ]

3 голосов
/ 07 января 2012

Статические методы не могут быть абстрактными или виртуальными в Java (что имеет смысл, если учесть, как Java осуществляет диспетчеризацию через vtables). Что вы должны сделать, это создать экземпляр и сделать его одиночным.

Учитывая способ доступа к load(), вам не нужно полиморфное поведение. Возможно, ваш реальный случай более сложный, но ваш фрагмент кода не показывает необходимость полиморфизма.

2 голосов
/ 07 января 2012

Нет, абстрактные или виртуальные статические методы не имеют смысла - но вам это тоже не нужно.Просто удалите абстрактный метод load() из DataPacket, и код будет работать так, как вы ожидаете.

Почему нет смысла иметь виртуальные статические методы?Поскольку статические методы всегда вызываются через ссылку на класс, а не через ссылку на объект.Даже если можно написать foo.staticMethod(), где foo - переменная объявленного типа Foo, вы действительно вызываете Foo.staticMethod(), даже если foo действительно ссылается на экземпляр SubclassOfFoo.

Если вам действительно нужно вызвать статический метод, основанный на фактическом типе некоторого объекта (в отличие от объявленного типа переменной, которая ссылается на объект), вам нужно создать нестатический метод, который вызываетсоответствующий статический метод и переопределите его в подклассах.

0 голосов
/ 07 января 2012

Статические методы не наследуются, потому что они принадлежат классу, а не отдельным объектам. Следовательно, код не будет компилироваться.

...