2017-02-17 43 views
0

Переменные экземпляра идут в стек, а объекты идут на кучу, а ссылки на объекты идут в стек. Правильно? Но что, если переменная экземпляра была ссылкой на объект? Как var c:Экземпляр var, относящийся к объекту

class clony implements Cloneable { 

    clony c = new clony(); 

    @Override 
    protected Object clone() throws CloneNotSupportedException { 
     return super.clone(); 
    } 
} 

class tst2 { 

    public static void main(String[] args) throws CloneNotSupportedException { 
     clony j1 = new clony(); 
    } 
} 

И если он идет на кучу, почему он выбрасывает и переполняет ошибку переполнения?

ответ

0

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

2

Ваша ссылка c является полем класса clony. Это означает, что ссылка будет храниться в куче внутри области памяти, которая выделена для объекта clony.

И ваша программа генерирует исключение переполнения стека, так как clony бесконечно строит себя: Внутри конструктора clony вы создаете новый объект clony и назначить его на поле c: Что будет делать то же самое снова и снова.

0

Я думаю, что это:

clony c = new clony(); 

дает вам исключение.

new clony() also has clony c = new clony() 

внутри ... и он уходит в бесконечность.

Кстати, классы следует называть с заглавной буквой в начале.