среда, 1 августа 2012 г.

questions: by-ref-by-value

    Помните, массивы - ссылочные типы, даже массивы примитивов. И помните, что примитивы передаются по значению, ссылочные типы (экземпляры классов, массивы, enum-ы) - по ссылке:
public class RefValueQuiz {
    public static void main(String[] args) {
        int x = 0;
        int[] arr = {20};
        f(x, arr);
        System.out.println(x + " " + arr[0]);
        g(x, arr);
        System.out.println(x + " " + arr[0]);
    }

    private static void f(int x, int[] arr) {
        x += 30;
        arr[0] = 40;
    }

    private static void g(int x, int[] arr) {
        x = 50;
        arr = new int[]{60};
    }
}
>> 0 40
>> 0 40


    А теперь вернем что-нибудь из метода:
public class RefValueQuiz1 {

    public static void main(String[] args) {
        int x = 0;
        int[] arr = {20};
        x = f(x, g(x, arr));
        System.out.println(x + " " + arr[0]);
    }

    private static int f(int x, int[] arr) {
        x += 30;
        arr[0] = 40;
        return 42;
    }

    private static int[] g(int x, int[] arr) {
        x = 50;
        arr = new int[]{60};
        return arr;
    }
}
>> 42 20