Почему объект кнопки ведет себя по-разному в зависимости от того, где он объявлен - PullRequest
0 голосов
/ 28 декабря 2018

Я пишу приложение для Android на Java (с Codename One).Я занимаюсь Java около 3 лет (Swing, FX, после года Python), но не профессиональный программист.Итак, для профессионалов, будьте любезны со мной.

Вот моя проблема: Я заметил, что проект может работать совершенно по-разному, в зависимости от того, инициируется ли переменная внутри дляили в начале класса.

Вот некоторый код:

В *1000* первом сценарии создается экземпляр кнопки внутри цикла for, либо вызывая кнопку, либо добавляя ее через список.При запуске проекта результаты идентичны:

for (int i = 0; i < list.size(); i++) {

        Button button = new Button("test"); // OR
        Button button = new Button(list.get(i));
        form.add(button);
 };

Во втором сценарии кнопка создается вне цикла for.В этом случае результат отличается, когда я использую ArrayList или кнопку.

public class Test {

    private Button button;

    public void animation() {       

        for (int i = 0; i < list.size(); i++) {

            button = new Button("test");        // OR
            button = new Button(list.get(i));
            form.add(button);
        }
    }
}

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

Я решил часть программирования, но, независимо от непосредственных последствий для проекта, почему в Java может иметь значение, в какой момент, внутри или вне цикла for, вы создали экземпляр переменной?И почему это важно, если я использую ArrayList или нет?

Для меня это не имеет смысла.Это неожиданное поведение Java или что-то происходит под капотом, о котором я не знаю?

Кто-нибудь может объяснить?

1 Ответ

0 голосов
/ 28 декабря 2018

Вот моя проблема: я заметил, что проект может работать совершенно по-разному, в зависимости от того, инициируется ли переменная внутри цикла for или в начале класса.

Некоторые пояснения:

Сценарий 1:

for (int i = 0; i < list.size(); i++) {

        Button button = new Button("test"); // OR
        Button button = new Button(list.get(i));
        form.add(button);
 };

Рассмотрим утверждение: Button button = new Button("Press me");

new Button() создает новый Buttonобъект и назначается (=) переменной button.button является ссылочной переменной типа Buttonbutton ссылается или указывает на ячейку памяти.Обратите внимание, что приведенный выше код находится внутри метода, а также внутри блока (for-loop), поэтому button является локальной переменной или переменной метода.

Для каждой итерации цикла for новый объект Button имеет видсоздается и ссылка (ячейка памяти) сохраняется или добавляется в form.Если цикл for выполняется 3 раза, существует три различных Button объекта и три ссылки.

Сценарий 2:

private Button button;

Вышеупомянутое утверждение объявляет button ссылочную переменную (типа Button).Это переменная экземпляра ;существует только один его экземпляр для (одного) объекта класса, в котором он объявлен. Это означает, что всякий раз, когда создается объект класса Test (например, Text test = new Test() или new Test()),будет только одна переменная button и одно место в памяти.

public void animation() {       

    for (int i = 0; i < list.size(); i++) {
        button = new Button("test");
        form.add(button);

При первом запуске кода button = new Button("test"); в цикле for переменной экземпляра button назначаетсяновый Button объект (новая кнопка («тест»)).Это указывает на место в памяти переменной button.Для второй итерации цикла for создается новый новый объект Button, которому назначается та же самая переменная кнопки (ячейка памяти) и т. Д.

Итак, buttonПамять переменной экземпляра переназначается снова и снова, и именно поэтому вы видите это «несогласованное» поведение.

ПРИМЕЧАНИЯ:

См. это сообщение является автороммной: Ссылки на объекты в Java .

Также попробуйте узнать, что такое куча памяти в Java.

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