Gymterview
junior

Каким образом передаются переменные в методы, по значению или по ссылке?

В Java параметры всегда передаются только по значению, что определяется как «скопировать значение и передать копию». С примитивами это будет копия содержимого. Со ссылками - тоже копия содержимого, т.е. копия ссылки. При этом внутренние члены ссылочных типов через такую копию изменить возможно, а вот саму ссылку, указывающую на экземпляр - нет.

Пример:

Пример
public class PassByValueExample {
    public static void main(String[] args) {
        // 1. Примитивный тип — значение копируется, оригинал не изменяется
        int x = 10;
        changeValue(x);
        System.out.println(x); // 10 — значение не изменилось

        // 2. Ссылочный тип — копия ссылки указывает на тот же объект,
        //    поэтому изменение внутреннего состояния объекта видно снаружи
        StringBuilder sb = new StringBuilder("Hello");
        appendText(sb);
        System.out.println(sb); // Hello World — содержимое объекта изменилось

        // 3. Переприсвоение ссылки внутри метода не влияет на оригинал
        StringBuilder sb2 = new StringBuilder("Original");
        replaceReference(sb2);
        System.out.println(sb2); // Original — ссылка не изменилась
    }

    static void changeValue(int val) {
        val = 99; // изменяем локальную копию
    }

    static void appendText(StringBuilder builder) {
        builder.append(" World"); // изменяем объект через копию ссылки
    }

    static void replaceReference(StringBuilder builder) {
        builder = new StringBuilder("New"); // переприсваиваем локальную копию ссылки
    }
}