Время жизни статических (класс) переменных

Довольно долго я был в блаженстве от мнения о том, что существуют статические переменные [instance], пока приложение работает. Однако, к моему ужасу и тревоге, я чувствую, что это неправда.

Для простого тестирования я создал статический список строк, а в моем основном классе activity onDestroy метод onDestroy для печати сообщения, чтобы проверить, что приложение вышло. onCreate методе onCreate я просто добавил новую string и распечатал содержимое списка. Я обнаружил, что размер списка продолжает увеличиваться, и все добавленные ранее значения строк все еще присутствуют.

Я читал в местах [даже здесь, на SO], что переменные экземпляра существуют до тех пор, пока приложение работает, но я боюсь, что это не так.

Чтобы быть более точным, я узнал об этой проблеме при использовании SDK для Android для Android. Я видел, что экземпляры AuthListener в списке слушателей в классе SessionEvents просто продолжают увеличиваться с течением времени. Следовательно, всякий раз, когда приложение запускается и пользователь регистрируется при использовании FB, методы прослушивателя запускаются столько раз, сколько есть экземпляров, присутствующих в классе SessionEvents .

Кто-то заметил это раньше, и есть ли какая-то кардинальная ошибка, которую я совершаю в понимании того, как работает андроид?

что дает?

Спасибо за прочтение!

[ UPDATE ]
Я стою, исправленный BalusC и rdineiu . Я действительно не хотел создавать путаницу здесь о переменных экземпляра и класса. Увы, в моей поспешности, чтобы опубликовать мой вопрос, я совершил ошибку, которой не хотел. Я очень хорошо знаю разницу между переменными static и instance . Я просто намеревался написать переменные class и не могу понять, что получилось, чтобы ссылаться на статические переменные как переменные instance .

Однако мой вопрос все еще стоит. @MisterSquonk – нет, я не смущаюсь здесь о том, когда закончится моя Activity и когда приложение будет уничтожено. Вот что я попробовал на образце – у меня есть только ОДНА Activity которая служит Main . Когда я нажимаю кнопку «Назад» из этой Activity , я предполагаю, что действие будет удалено из стека, и приложение также будет уничтожено. Я запустил диспетчер задач, чтобы проверить, что мое приложение больше не работает.

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

Пример:

 class Test { public static int a; } 

Переменная a определяется самим классом , а не экземплярами класса. Каждый экземпляр получит доступ к одной и той же переменной. Если один экземпляр устанавливает значение от a до 5 , каждый другой экземпляр увидит значение как 5 . Переменная не исчезнет, ​​как только экземпляр исчезнет, ​​потому что он никоим образом не привязан к какому-либо экземпляру (это переменная класса ). Он будет продолжаться до конца времени (или до выхода приложения, в зависимости от того, что наступит раньше).

С другой стороны, в следующем примере используется переменная экземпляра:

 class Test { public int a; } 

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


Проиллюстрировать:

 import java.util.List; import java.util.ArrayList; class Test { // instanceVar will be initialized whenever a new Test object is created private List<Integer> instanceVar = new ArrayList<Integer>(); // staticVar will be initialized right now private static List<Integer> staticVar = new ArrayList<Integer>(); public void updateInstanceVar() { instanceVar.add(1); instanceVar.add(2); } public void updateStaticVar() { staticVar.add(1); staticVar.add(2); } public static void main(String[] args) { Test test1 = new Test(); test1.updateInstanceVar(); // test1.instanceVar = [1, 2] test1.updateStaticVar(); // Test.staticVar = [1, 2] Test test2 = new Test(); test2.updateInstanceVar(); // test2.instanceVar = [1, 2] test2.updateStaticVar(); // Test.staticVar = [1, 2, 1, 2] } } 

Так что – я опубликовал тот же вопрос [к сожалению, допуская ту же ошибку, что и static переменные как переменные instance ) в группе Android Developer Google.

Я получил очень хорошие отзывы, особенно от Кости . Мои взаимодействия в этой группе помогли мне понять основные «правила» платформы Android.

Надеюсь, поток сообщений также поможет вам.

Переменные экземпляра уничтожаются, когда приложение работает, но некоторые виджеты gui по умолчанию сохраняют свое состояние, а затем восстанавливают его в методе onCreate.

Intereting Posts