Вызвать нестатическую переменную, чтобы ее можно было использовать в другом классе (невозможно создать экземпляр)

у меня проблема

У меня есть несколько классов объектов, они называются "кошка", "собака" и т.д..

В этих классах я присвоил каждому объекту кошки и собаки свой собственный целочисленный энергетический уровень (поэтому, когда они «двигаются» через двумерный массив, они теряют и получают энергию). Я ссылаюсь на это, говоря this.energylevel.

Поскольку «уровень энергии» специфичен для каждого объекта, я не могу сделать его статическим. как я могу позволить «классу собак» видеть уровень энергии объектов кошек, который не статически хранится в «классе кошек»?

и я не могу создать экземпляр Cat c = new Cat(); в классе собаки, это уже сделано в основном методе.

Это все часть масштабного проекта, так что простите меня, если я недостаточно ясно объяснил.


person ssjg0ten5    schedule 30.03.2012    source источник
comment
Как вы хотите, чтобы Dog получил Cat?   -  person SLaks    schedule 30.03.2012
comment
Вы можете создать помощника, который передает данные между различными объектами в вашем основном классе. Таким образом, вы можете сказать dogA, что делает catA, или вы можете сказать dogA, что делает dogB. Вам просто нужен метод с двумя параметрами, один для объекта, чтобы сообщить, другой для объекта, чтобы сообщить о первом. Затем вы можете добавить в классы Dog и Cat метод, который принимает эту информацию и реагирует на нее.   -  person jzworkman    schedule 30.03.2012
comment
Решение есть в каждой книге, обучающей основам объектно-ориентированного программирования или Java.   -  person Wolfgang    schedule 30.03.2012


Ответы (1)


Вы можете добавить статический метод внутри объекта Cat, который будет возвращать нестатическую переменную на основе идентификатора Cat. Вам нужно будет хранить список кошек на статической карте внутри объекта Cat.

private static HashMap<String,Cat> cats = new HashMap<String,Cat>();
...
public static int getEnergy(String catId) {
    Cat myCat = cats.get(catId);
    return myCat.getEnergy();
}

public int getEnergy() {
    return this.energy()
}

В качестве альтернативы по запросу, если вы хотите искать по X, Y:

private static ArrayList<Cat> cats = new ArrayList<Cat>();

private int energy = 100;
private int x = 0;
private int y = 0;
...
public static int getEnergy(int x, int y) {
    //Energy of -1 being the error (not found) state.
    int energy = -1;
    for(Cat cat : cats) {
        if(cat.getX() == x && cat.getY() == y) {
            energy = cat.getEnergy();
        }
    }
    return energy;
}

public int getEnergy() {
    return this.energy()
}

public int getX() {
    return this.x;
}

public int getY() {
    return this.y;
}
person GavinCattell    schedule 30.03.2012
comment
Спасибо, GavinCattell, отличный ответ, но есть ли способ сделать идентификатор кошки равным местоположению в массиве 2d? - person ssjg0ten5; 30.03.2012
comment
Могут ли два объекта появиться в одном и том же месте? - person GavinCattell; 30.03.2012
comment
Эй, спасибо еще раз, но я написал код, и я получаю сообщение об ошибке при возврате myCat.getEnergy(); он по-прежнему говорит, что к нестатическому методу getEnergy() нельзя получить доступ из статического контекста, а в общедоступном статическом int getEnergy(int x, int y) отсутствует оператор return - person ssjg0ten5; 30.03.2012
comment
Там несколько опечаток, я их исправил. Пожалуйста, взгляните еще раз. - person GavinCattell; 30.03.2012
comment
Извините, чувак, я вывожу уровни энергии, и там написано, что все они равны -1 для кошек, я проверил и трижды проверил, чтобы убедиться, что я не сделал ничего плохого. - person ssjg0ten5; 31.03.2012
comment
Приведенный выше ответ определенно не сработает сам по себе. Все это будет зависеть от того, будут ли объекты правильно устанавливать свои X, Y и объекты, добавляемые в статический список ArrayList. Если вам нужна дополнительная информация, вам придется опубликовать больше своего кода, в том числе о том, как вы устанавливаете местоположения, энергию и т. д. - person GavinCattell; 31.03.2012