2013-08-31 4 views
3

объекта в качестве переменной класса вызывает StackOverflowпереполнение стека Java

public class stack { 
     stack obj = new stack(); // its obvious that during class loading obj will call class to 
     // load and infinite loop will occur. 
} 

Допустим, я использую static в из класса OBJ

public class stack { 
     static stack obj = new stack(); // it will not cause infinite loop and program will //execute successfully 
} 

Статические переменные выделяются в памяти, когда класс впервые попал в JVM (насколько я знаю). Говорите в первый раз только в том случае, если JVM начинает выделять память вышеопределенной переменной static. Это вызовет повторный вызов класса, и это также вызовет бесконечный цикл. Где-то я ошибаюсь. Может кто-нибудь подчеркнуть, где я ошибаюсь.

ответ

6

Нет, объявив, что static не вызовет бесконечный цикл. Вот почему.

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

Если вы объявляете это как нестатический атрибут, то это совершенно другая история. Рассмотрим это -

public class stack { 
    stack obj = new stack(); 

    ........ 
} 

Это объявление эквивалентно -

public class stack { 
    stack obj; 

    public stack() { 
     obj = new stack(); // implicitly moved here by the compiler 
    } 

    ........ 
} 

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

0

Загрузка класса «стек» вызовет создание экземпляра «стек», сохраненного как статическое поле класса стека. Тогда этому экземпляру класса стека нечего загружать: исключение стека.

0

ключевое слово Статический не имеет ничего общего с бесконечным циклом. Вы можете объявить поле, метод, класс (статический внутренний класс)

Статическое поле: - Статические поля создаются и инициализируются при первом загрузке класса. Это происходит, когда упоминается статический член класса или когда создается экземпляр класса, в зависимости от того, что наступит раньше.

Статический метод: - Метод, объявленный с ключевым словом static. Подобно статическим полям, статические методы связаны с самим классом, а не с каким-либо конкретным объектом, созданным из класса. В результате вам не нужно создавать объект из класса, прежде чем вы сможете использовать статические методы, определенные классом.

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

Перспектива памяти: - Поскольку класс загружается один раз, и его определение хранится в области перменов jvm, здесь сохраняются статические переменные и будут лежать в течение жизненного цикла jvm.

0

Статические переменные размещаются в памяти, когда класс пойманы JVM впервые

Не совсем.

Статические переменные выделяются при загрузке класса.

Статическая инициализация переменных выполняется при инициализации класса. Это может произойти через некоторое время после загрузки класса.

Говорите в первый раз только в том случае, если JVM начинает выделение памяти указанной выше статической переменной объекта. Это вызовет повторный вызов класса, и это также вызовет бесконечный цикл.

No. Это неверно по двум причинам:

  • объекты вообще не являются "интернированы". Интернирование - это операция на объектах String, и даже тогда это происходит только для струнных литералов. Нелитературные объекты String получают интернированный доступ, если ваше приложение вызывает String.intern()явно.

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

0

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

Затем управление входит в класс и находит статический переменный объект, но к этому времени он будет присвоен значением адреса памяти JVM (как и для других статических переменных). Control просто игнорирует переменную как экземпляр и предполагает чисто статическую и программу продолжается.

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