2014-10-24 4 views
0

я новичок в Java, и мой английский не так хорошо ... так что извините заранее :)Различные статические поля из класса и sublclasses

У меня есть суперкласс: Genericresource со статическим полем, кол сколько экземпляров создаются и способ для вызова этого значения:

public class Genericresource { 
private static int counter; 
public Genericresource() { counter++; } 
public static int howmany() { return counter; } 
//other useful code here 
} 

и я хочу, чтобы создать некоторые пол-идентичные подклассы, каждый для определенного ресурса:

public class Type1Resource extends Genericresource { 

// here specific code 

} 

Теперь, в т он главный класс:

Genericresource a1 = new Genericresource(); 
Genericresource a2 = new Genericresource(); 
Type1Resource b = new Type1Resource(); 
Type1Resource b2 = new Type1Resource(); 
int howa = Genericresource.howmany(); 
int howb = Type1Resource.howmany(); 

и я ожидал, что я буду использовать два различных счетчика статические поля, одно для суперкласса Genericresource, и один для подкласса Type1Resource. Мой желаемый результат: Howa = 2 howb = 2. Мой реальный результат: Howa 4 howb 4.

Так я использую тот же счетчик статическое поле, даже если я Instantiate 2 разных классов, в то время как мне нужно Мне нужно вместо этого ссылаться на разные статические поля счетчика, по одному для каждого подкласса, одновременно сохраняя структуру статических методов суперкласса. Как я могу это сделать?

ответ

3

Статические переменные относятся к class, поэтому counter вы ссылаетесь в обоих Genericresource и Type1Resource является Genericresource.counter (через неявный параметр меньше вызова конструктора в дочернем классе), следовательно, его значение 4 после двух экземпляров каждого.

Объявите счетчик static в Type1Resource и увеличьте его в конкретном конструкторе Type1Resource, если вы хотите специально подсчитать только эти экземпляры.

Я предлагаю использовать другое название для нового счетчика, а также для ясности.

+1

является правильным. Если вы все еще хотите иметь этот дизайн, вам необходимо реорганизовать другую структуру данных, такую ​​как Map

+0

@andresoviedo Я согласен ... или заводской шаблон. – Mena

+0

Идея состоит в том, чтобы обеспечить уникальную реализацию Genericresource с глобальными операциями над конкретными ресурсами. Мой проект - это системная плата (для проверки моих собственных бета-версий boardgame), и я отобразил класс Genericresource для всех опечаток ресурсов со статической дисперсией поля int и статичной суммой int, которая подсчитывает (при необходимости) сумму из общих ячеек, которые у меня есть, и GoldResource как sublclass для «золотых» плиток, с одинаковыми статическими полями для подсчета конкретного использования плиток. Конечно, я могу переосмыслить структуру данных, но она была настолько изящной, что все со статическими полями –

Смежные вопросы