Как отмечает Феликс в комментарии, аргументы Java передаются по значению.
Это понятнее, если мы используем различные имена переменных:
public static void main(String arg[]) {
int x = 0;
method(x);
System.out.println(x); // Prints 0
}
static void method(int y) {
y = 2;
}
При вызове method(x)
, значение x
вычисляется, и это значение становится начальным значением y
. Это только связь между двумя переменными. Изменение значения y
не меняет значение x
.
Теперь с переменными ссылочного типа может появиться, как будто это не так:
public static void main(String arg[]) {
StringBuilder x = new StringBuilder();
method(x);
System.out.println(x); // Prints "appended"
}
static void method(StringBuilder y) {
y.append("appended");
}
Это выглядит немного, как вы изменили значение x
- но вы действительно не , Значения x
и y
- это всего лишь ссылки объекту ... и x
, и y
относятся к одному и тому же объекту, а вызов append
изменил данные внутри объекта. Аналогию, которую я хотел бы использовать здесь, это дома: в качестве вызывающего метода я могу дать вам лист бумаги с моим адресом, написанным на нем. Этот адрес является эквивалентом ссылки , тогда как мой дом является объектом .
Вы можете изменить две вещи:
- Вы можете пойти и покрасить входную дверь красный, который делает изменения в объекте. Я увижу это изменение в следующий раз, когда посмотрю на свой дом.
- Вы можете изменить адрес, указанный на листе бумаги.
Ни один из них не вносит изменения в «где я живу» - моя копия ссылки на «мой дом» такая же, как и прежде, независимо от того, что вы сделали.
Поведение, когда дело доходит до занятий, приводит к обычно заявляемому мифу о том, что «Java передает примитивы по значению и объектам по ссылке» - это просто неверно. Java передает все аргументы по значению - но вам нужно понять, что значение выражения равно всегда либо примитивное значение, либо ссылка, а не объект.
Поскольку аргументы передаются по значению, а не по ссылке. См. Также http://en.wikipedia.org/wiki/Evaluation_strategy –
@FelixKling Как я могу решить эту проблему (обновление s) – sprabhakaran
@ dangerous проверить мой ответ .. –