0Pricing
Java Academy · Урок

Передача по значению в 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 — локальная установка не требуется.

Все уроки этого курса

  1. Передача по значению в Java
  2. Статические и экземплярные методы
  3. Разбиение методов и чистый код
← Назад к Java Academy