Доступ к переменной, которая инициализирована / объявлена ​​в конструкторе внутри метода, принадлежащего тому же классу java - PullRequest
0 голосов
/ 05 марта 2020

Мне нужно использовать переменные из моего конструктора WinterCarnival () в моем методе update (). Метод update () не может иметь никаких параметров. Я создал объект моего класса FrozenStatue в конструкторе, но мне нужно вызвать метод из класса FrozenStatue из метода update. По сути, мне нужно получить доступ к frozStatObj01 в моем методе обновления.

publi c класс WinterCarnival extends SimulationEngine {

public WinterCarnival() {
    ArrayList<FrozenStatue> objects = new ArrayList<FrozenStatue>(); 
    float[] fsObjPosition01 = new float[2];
        fsObjPosition01[0] = 600;
        fsObjPosition01[1] = 100;
    float[] fsObjPosition02 = new float[2];
        fsObjPosition02[0] = 200;
        fsObjPosition02[1] = 500;
    FrozenStatue frozStatObj01 = new FrozenStatue(fsObjPosition01);
    FrozenStatue frozStatObj02 = new FrozenStatue(fsObjPosition02);

    objects.add(frozStatObj01);
    objects.add(frozStatObj02);
} 

@Override
public void update() { 

}
public static void main(String[] args) {
    WinterCarnival wintCar = new WinterCarnival();

}}

Ответы [ 2 ]

0 голосов
/ 05 марта 2020

Dovetalk дал вам правильный ответ, но позвольте мне добавить объяснение.

Вы использовали локальные переменные ...

  • Локальные переменные объявлены в методах, конструкторы или блоки.

  • Локальные переменные создаются при вводе метода, конструктора или блока, и эта переменная будет уничтожена при выходе из метода, конструктора или блока.

Чтобы иметь «видимость» (чтобы быть видимой) для других методов в вашем классе, вам нужно было использовать переменную INSTANCE (переменную MEMBER в некоторых других языках.)

  • Переменные экземпляра объявляются в классе, но вне метода, конструктора или любого блока.

Это то, что Dovetalk сделал с вашим объектом ArrayList. В противном случае, он виден только внутри конструктора, а также уничтожается после его завершения ... это был только ЛОКАЛЬНЫЙ, только внутри конструктора. Dovetalk изменил его на переменную INSTANCE. Затем он существует в течение всей жизни экземпляра WinterCarnival и виден всем методам класса WinterCarnival.

Надеюсь, это добавит вам объяснение о том, что там происходит.

0 голосов
/ 05 марта 2020

Я предполагаю, что это переменная objects, к которой вам нужно получить доступ из update().

Что вам нужно сделать, это переместить ее из локальной переменной в поле, например:

public class WinterCarnival {


...
    private ArrayList<FrozenStatue> objects;

    public WinterCarnival() {
        objects = new ArrayList<FrozenStatue>(); 
        float[] fsObjPosition01 = new float[2];
            fsObjPosition01[0] = 600;
            fsObjPosition01[1] = 100;
        float[] fsObjPosition02 = new float[2];
            fsObjPosition02[0] = 200;
            fsObjPosition02[1] = 500;
        FrozenStatue frozStatObj01 = new FrozenStatue(fsObjPosition01);
        FrozenStatue frozStatObj02 = new FrozenStatue(fsObjPosition02);

        objects.add(frozStatObj01);
        objects.add(frozStatObj02);
    } 

...

}

Теперь вы можете получить доступ к objects из update().

PS. В общем случае следует избегать конкретных типов в объявлениях переменных в пользу интерфейсов. В вашем случае используйте List вместо ArrayList:

private List<FrozenStatue> objects;

Вы все равно можете инициализировать его как ArrayList.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...