Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / неизменяемые параметры в функцию / 9 сообщений из 9, страница 1 из 1
15.07.2013, 12:09:10
    #38331121
NDAleksey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
неизменяемые параметры в функцию
Доброго всем времени!
Стал изучать Java и столкнулся с проблемой. В "Философии Явы" (может невнимательно читал) указано, чтобы передаваемые параметры в функцию остались неизменными, нужно использовать "final", иначе значения изменятся (конечно ссылочных типов). Пишу следующий код:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
class Temp
{
	public int data;
	
	public Temp( int data )
	{
		this.data = data;
	}
	
	public void showData()
	{
		System.out.format( "data = %d\n", data );
	} 
}

public class TestExamples
{
	public static void foo( Temp temp )
	{
		temp = new Temp( 10 ); 
		
		temp.showData();
	}
	
	public static void main( String[] args )
	{
		Temp temp = new Temp( 5 );
		
		foo( temp );
		
		temp.showData();
	}

}



Прошу разъяснить, почему не изменилась ссылка передаваемого "temp"?
...
Рейтинг: 0 / 0
15.07.2013, 12:17:00
    #38331138
Penkov Vladimir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
неизменяемые параметры в функцию
потому что параметры передаются по сылке. в методе foo локальная ссылка на аргумент.
...
Рейтинг: 0 / 0
15.07.2013, 12:21:35
    #38331152
Penkov Vladimir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
неизменяемые параметры в функцию
немного неправильно объяснил. значение вовне не изменяется не потому что параметры передаются по ссылке (в смысле этот факт не решающий), а потому что при вызове метода аргумент будет локальным и его изменение не приведет к побочному эффекту
...
Рейтинг: 0 / 0
15.07.2013, 12:28:05
    #38331161
NDAleksey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
неизменяемые параметры в функцию
Penkov Vladimir,

но! только щас нашел в одной статейке, а понять не могу. если я в вызывающем методе напишу:
Код: java
1.
2.
3.
4.
	public static void foo( Temp temp )
	{
		temp.data = 10;
	}



тогда у меня в Main у temp.data значение станет 10 (вместо 5). Вопрос: почему если я передаю по ссылке, то значения полей меняются, а сам объект (ссылка) не меняется? И если нетрудно - краткий экскурс: чем понятие "объект" отличается от понятия "ссылка" в Яве? (если нетрудно)
...
Рейтинг: 0 / 0
15.07.2013, 12:32:27
    #38331171
Penkov Vladimir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
неизменяемые параметры в функцию
вы путаете immutable и final параметры.

почитайте что такое побочный эффект вызова функции
...
Рейтинг: 0 / 0
15.07.2013, 12:35:49
    #38331178
Penkov Vladimir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
неизменяемые параметры в функцию
...
Рейтинг: 0 / 0
15.07.2013, 12:45:09
    #38331202
carper
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
неизменяемые параметры в функцию
NDAlekseyДоброго всем времени!
Стал изучать Java и столкнулся с проблемой. В "Философии Явы" (может невнимательно читал) указано, чтобы передаваемые параметры в функцию остались неизменными, нужно использовать "final", иначе значения изменятся (конечно ссылочных типов).


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

В JAVA аргументы всегда предаются по значению, применительно у указателю/ссылке, это означает, что передается копия указателя.
Таким образом, вы можете менять значения/состояние того объекта на который указывает указатель, но не сам указатель.
Если указатель/ссылку не объявить как final, то программист сможет в коде метода изменять сам указатель, и при этом забыть, что по выходе из метода, все изменения самого указателя пропадут.
...
Рейтинг: 0 / 0
15.07.2013, 13:10:37
    #38331263
NDAleksey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
неизменяемые параметры в функцию
carper, Penkov Vladimir, спасибо!
...
Рейтинг: 0 / 0
15.07.2013, 13:17:01
    #38331275
rfq
rfq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
неизменяемые параметры в функцию
NDAlekseyПрошу разъяснить, почему не изменилась ссылка передаваемого "temp"?
Потому что ее никто и не менял.

В вызываемом методе менялся параметр метода foo, но не локальная переменная метода main. Это две разные ячейки памяти. Между прочим, сам объект, сгенерированный по new Temp(10) - вообще третий участок памяти.

В общем поищите где-нибудь, как это укладывается на машинную память - стек, куча, вызовы процедур, ссылки, чтобы не мешать одни понятия с другими. Необязательно для jav'ы, все языки в этом плане примерно одинаковы.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / неизменяемые параметры в функцию / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]