Передача по значению в Java
Разберитесь с передачей по значению в Java: примитивы и ссылки, переназначение и изменение объекта, массивы и особенности неизменяемых объектов.
«Передача по значению в Java» — бесплатный урок Java Academy на CoddyKit. Это урок 1 из 3. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Java Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Java Academy содержит 3 уроков всего.
Обзор передачи по значению
Цель: узнать, как Java передаёт параметры. Сравните примитивы и ссылки, переназначение и изменение, массивы и неизменяемость.
Копирование примитивов
Примитивы передаются по значению: вызываемый метод получает копию. Переназначение параметра не изменяет переменную вызывающего кода.
public class Main {
static void inc(int x) {
x = x + 1; // modifies the local copy only
}
public static void main(String[] args) {
int a = 5;
inc(a);
System.out.println("a after inc(a) = " + a); // still 5
}
}
Ссылки: изменение и переназначение
Для объектов копируется ссылка. Изменение объекта через эту ссылку влияет на объект вызывающего кода, а переназначение параметра — нет.
public class Main {
static class Box { int n; }
static void setTo999(Box b) { b.n = 999; } // mutate via copied reference
static void reassign(Box b) { b = new Box(); b.n = 123; } // reassign local copy only
public static void main(String[] args) {
Box bx = new Box();
bx.n = 10;
setTo999(bx);
System.out.println("after setTo999: bx.n = " + bx.n); // 999
reassign(bx);
System.out.println("after reassign: bx.n = " + bx.n); // still 999
}
}
Массивы: изменение и переназначение
Массивы являются объектами. Их изменение влияет на массив вызывающего кода, а переназначение параметра не заменяет массив вызывающего кода.
public class Main {
static void fillZero(int[] a) {
for (int i = 0; i < a.length; i = i + 1) a[i] = 0; // mutate caller array
}
static void replace(int[] a) {
a = new int[] {9, 9, 9}; // reassign local copy of the reference
}
public static void main(String[] args) {
int[] arr = {1, 2, 3};
fillZero(arr);
System.out.println("after fillZero: " + arr[0] + "," + arr[1] + "," + arr[2]); // 0,0,0
replace(arr);
System.out.println("after replace: " + arr[0] + "," + arr[1] + "," + arr[2]); // still 0,0,0
}
}
Неизменяемые и изменяемые объекты
String является неизменяемым и возвращает новые объекты, а StringBuilder является изменяемым и изменяет тот же экземпляр.
public class Main {
static void tryChangeString(String s) {
s = s + "!"; // new String; original unchanged
}
static void changeBuilder(StringBuilder sb) {
sb.append("!"); // mutates same object
}
public static void main(String[] args) {
String s = "hi";
tryChangeString(s);
System.out.println("after tryChangeString: " + s); // "hi"
StringBuilder sb = new StringBuilder("hi");
changeBuilder(sb);
System.out.println("after changeBuilder: " + sb.toString()); // "hi!"
}
}
Правильная перестановка
Поскольку параметры являются копиями, перестановка примитивов внутри метода не влияет на вызывающий код. Возвращайте новые значения (или объект-контейнер).
public class Main {
static void trySwap(int a, int b) {
int t = a; a = b; b = t; // swaps local copies only
}
static int[] swap(int a, int b) {
return new int[] { b, a }; // return results to the caller
}
public static void main(String[] args) {
int x = 1, y = 2;
trySwap(x, y);
System.out.println("after trySwap: x=" + x + ", y=" + y); // 1,2
int[] res = swap(x, y);
x = res[0]; y = res[1];
System.out.println("after swap: x=" + x + ", y=" + y); // 2,1
}
}
Проверка передачи по значению
Быстрая проверка: какое утверждение о передаче параметров в Java является правильным?
Повторение и далее
Повторение: Вы изучили примитивы и ссылки, изменение и переназначение, массивы как объекты, неизменяемость и безопасный шаблон перестановки. Далее: статические и экземплярные методы.
Часто задаваемые вопросы
Урок «Передача по значению в Java» бесплатный?
Да — полный текст урока «Передача по значению в Java» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Java Academy, подпишись на CoddyKit PRO. Курс Java Academy содержит 3 уроков всего.
Чему я научусь в уроке «Передача по значению в Java»?
Разберитесь с передачей по значению в Java: примитивы и ссылки, переназначение и изменение объекта, массивы и особенности неизменяемых объектов. Ты практикуешь Java Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Java Academy?
Предыдущий опыт не требуется. Java Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 3.
Сколько времени занимает урок «Передача по значению в Java»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Java Academy?
Да. Каждый урок Java Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Передача по значению в Java
- Статические и экземплярные методы
- Разбиение методов и чистый код