// 1. hét – Érték és referencia Java nyelven
// Futtatás: java ValueRef.java
public class ValueRef {

    // A primitív paraméter az érték MÁSOLATÁT kapja meg.
    static void increment(int x) {
        x = x + 1;
    }

    // A tömb paraméter a referencia másolatát kapja: ugyanarra az objektumra mutat.
    static void incrementFirst(int[] t) {
        t[0] = t[0] + 1;
    }

    // Az új objektum létrehozása csak a helyi másolatot állítja át.
    static void replace(int[] t) {
        t = new int[] { 99, 99, 99 };
    }

    // Csere: Java-ban két int változó tartalmát függvénnyel nem lehet felcserélni.
    // Tömbelemeket viszont igen, mert a tömböt referencián keresztül érjük el.
    static void swap(int[] t, int i, int j) {
        int tmp = t[i];
        t[i] = t[j];
        t[j] = tmp;
    }

    public static void main(String[] args) {
        int a = 5;
        increment(a);
        System.out.println("increment után a = " + a); // 5 – nem változott

        int[] arr = { 10, 20, 30 };
        incrementFirst(arr);
        System.out.println("incrementFirst után arr[0] = " + arr[0]); // 11

        replace(arr);
        System.out.println("replace után arr[0] = " + arr[0]); // 11 – nem változott

        // Két változó ugyanarra az objektumra mutat (aliasing)
        int[] other = arr;
        other[1] = 0;
        System.out.println("other[1] = 0 után arr[1] = " + arr[1]); // 0

        // Összehasonlítás: == a referenciákat, Arrays.equals a tartalmat veti össze
        int[] copy = { 11, 0, 30 };
        System.out.println("arr == copy ? " + (arr == copy));                              // false
        System.out.println("Arrays.equals ? " + java.util.Arrays.equals(arr, copy));        // true

        swap(arr, 0, 2);
        System.out.println("swap után: " + java.util.Arrays.toString(arr)); // [30, 0, 11]

        // null: a referencia nem mutat objektumra
        int[] nothing = null;
        System.out.println("nothing == null ? " + (nothing == null));
        // nothing[0] = 1;  // NullPointerException lenne!
    }
}
