Передача объектов в методы

Объекты допускается передавать методам в качестве параметров точно так же, как и примитивные значения. При этом объекты передаются по ссылке на них. Метод может изменять полученные значения. Самый важный вопрос здесь - а будут ли изменяться эти значения в вызвавшем методе? Если в метод передан объект - то будут, если же это примитивное значение - то нет. Почему так? Давайте рассмотрим на следующем примере.

Пример 1. Изменение переданных значений в методе

При запуске программы в стеке выделяется область памяти для метода main(). Там хранятся локальные переменные x и y. При вызове метода changePrimitives() в стеке выделяется еще одна область памяти, в которой создаются локальные переменные а и b. Их значения хранятся там же. Если а и b изменяются, это никак не влияет на переменные x и y - они хранятся в разных областях памяти.

Локальная объектная переменная box создается в стековой области памяти метода main(), но сам объект создается в куче. При вызове метода changeObject() передается не сам объект, а ссылка на него. Поэтому при изменении переменной о в методе changeObject(), меняется объект находящийся куче. И эти изменения, естественно, видны в вызвавшем методе main():

public class Box {
    double width;
    double height;
    double depth;

    Box(double w, double h, double d) {
        width = w;
        height = h;
        depth = d;
    }
}
public class TestDemo {
    /**
     * Изменение объекта
     *
     * @param box
     */
    static void changeObject(Box box) {
        box.width *= 2;
        box.height /= 2;
        box.depth += 2;
    }

    /**
     * Изменение примитивных типов
     *
     * @param a
     * @param b
     */
    static void changePrimitives(int a, int b) {
        a *= 2;
        b /= 2;
    }

    public static void main(String[] args) {
        Box box = new Box(5, 6, 7);

        int x = 10;
        int y = 10;
        System.out.println("x и y перед вызовом: " + x + " " + y);
        changePrimitives(x, y);
        System.out.println("x и y после вызова: " + x + " " + y);

        System.out.println("box перед вызовом: " + box.width + " " + box.height + " " + box.depth);
        changeObject(box);
        System.out.println("box после вызова: " + box.width + " " + box.height + " " + box.depth);
    }
}

Результат выполнения:

x и y перед вызовом: 10 10
x и y после вызова: 10 10
box перед вызовом: 5.0 6.0 7.0
box после вызова: 10.0 3.0 9.0

Объекты можно создавать в методе и возвращать их. Например, как показано в следующем примере:

Пример 2. Возврат объекта из метода

public class ReturnObject {
    int a;

    ReturnObject(int i) {
        a = i;
    }

    ReturnObject incrementByTen() {
        ReturnObject temp = new ReturnObject(a + 10);
        return temp;
    }

    public static void main(String[] args) {
        ReturnObject ob1 = new ReturnObject(2);
        ReturnObject ob2 = ob1.incrementByTen();
        System.out.println("ob1.a: " + ob1.a);
        System.out.println("ob2.a: " + ob2.a);
    }
}
Read also:
Comments