2016-09-25 2 views
0

Я смотрю на изучение Java, и в настоящее время я изучаю настройки классов. Я вижу, что наиболее распространенным способом создания сеттера является нечто подобное.Переменные стека в Java (новичок)

class Apple{ 
    private String _name; 

    //Setters 
    public void setName(String name){ 
     _name = name; 
    } 
} 

Я привык к C, поэтому этот код вызывает у меня вопрос. Если я устанавливаю _name = name в функции, после того, как эта функция будет завершена, и его стек будет отброшен, почему переменная _name все еще сохраняет правильное значение? Это сбивает с толку, потому что в C, если я укажу указатель на другой указатель внутри такой функции, это, вероятно, вызовет ошибку сегментации (поскольку имя является временной переменной).

+2

Вы назначаете ссылки на объекты. '_name' не ссылается (или указывает) на' name', поэтому не имеет значения, что 'name' будет удалено. – Tom

+1

Java ориентирован на объекты, C нет. Java имеет экземпляры объектов, когда C не работает. – Chisko

+0

использовать «this» для обращения к текущему объекту –

ответ

-3

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

Поскольку вы устанавливаете _name для частного доступа, его можно получить только внутри класса Apple. Вы не можете изменить его в своем основном методе, и именно поэтому вы создаете метод set, чтобы его можно было изменить внешними классами (т.е. ваш основной метод)

+1

'_name = name' полностью допустимо ... Вы также не отвечаете на вопрос. – Li357

+0

Я думаю, лучший ответ заключается в том, что вы указываете ссылку на имя так же, как и ссылку на _name. –

+0

Отредактировано: надеюсь, что более полезно –

0

В Java вы, как пользователь, не имеете контроля над стеком как на языках C/C++.

Кроме того, все не примитивные типы данных (int, double и т. Д.) Хранятся в куче. Пользователь может использовать ссылки или указатели и не обязан выполнять какое-либо управление памятью, поскольку механизм, известный как garbage collector, уже освобождает те экземпляры, которые не имеют к ним никакой ссылки. Таким образом, не существует такой вещи, как указатели в Java, хотя вы можете присвоить значение null к непримитивных переменной: Foo f = null;

Таким образом, в Java вы можете буквально вести себя, что ++ делает код C:

class Foo { 
    Foo(int a) {} 
}; 

void bar(int a) { 
    Foo f(a); // f is placed in the stack 
} 

единственный путь вы можете создать экземпляр Foo в Java будет выглядеть так:

void bar(int a) { 
    Foo f = new Foo(a); /* f is a reference to the new instance 
         * (placed in heap) */ 
} 
0

на самом деле, name является переменной экземпляра и setName() является методом экземпляра. Это означает, что для каждого объекта класса Apple имеется отдельная копия name. Метод setName() устанавливает значение для глобальной переменной объекта, с которым он вызван, с именем его аргумента. Таким образом, даже после того, как стек метода отбрасывается, объект существует, а также значение копии этого объекта name. Смотрите этот пример ниже:

class Apple { 
    private String name; //instance variable 

    public void setName(String name) { 
     this.name = name; //same as what you have written 
    } 

    //main method 
    public static void main(String[] args) { 
     Apple obj = new Apple(); //object created 
     Apple obj2=new Apple(); 
     obj.setName("Yolo"); 
     obj2.setName("Yay!"); 
     System.out.println(obj.name); //displays obj's copy of name that holds the value "Yolo" 
     System.out.println(obj2.name); //displays obj2's name 
    } 
} 

Это показывает

Yolo 
Yay! 

Я надеюсь, что это делает его ясно.

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