Nel main:
imposti a=4 e b=7 e stampi (1 - a=4, b=7)
poi chiami alfa(a,b)

In alfa:
vengono allocate in memoria DUE NUOVE variabili, a e x.
Ad a viene assegnato il valore di a. (Anche se omonime sono due variabili diverse!!!)
Ad x viene assegnato il valore di b.
stampi (2 - a=4, x=7)

a = a + 3; Ad a assegni il valore 4+3, cioé 7
x = x - 3; A x assegni il valore 7-3, cioé 4
stampi (3- a=7, x=4)

Nel main:
stampi (4 - a=4, b=7)
a e b hanno mantenuto il loro valore originale perchè non sono mai state modificate!
Quando le hai passate al metodo alfa() non hai passato le variabili a e b ma il loro valore!!!!

ATTENZIONE!!!
Questo comportamento vale solo per i tipi dati 'primitivi' (int, short, long, ecc..) perché non sono oggetti.

Per gli oggetti (istanze di classe) il discorso cambia...
Prova questo pezzo di codice:

/** incapsula un tipo di dato primitivo (valore) dentro una classe */
Class X {
int valore = 0;
public int getValore() { return valore; }
public void setValore(int v) { valore = v; }
public void somma(int s) { valore += s; }
}

/** classe di lancio (main) */
Class Y {
public static void main(String[] args) {

int a = 4;

X b = new X();
b.setValore(7);

System.out.println("1 - a="+a+", b="+b.getValore());
alfa(a, b);
System.out.println("4 - a="+a+", b="+b.getValore());
}

public static void alfa(int a, X x) {
System.out.println("2 - a="+a+", x="+x.getValore());
a += 3; // equivalente: a = a + 3
x.somma(-3); // fac-simile di x = x - 3 ma con l'uso del metodo somma
System.out.println("3 - a="+a+", x="+x.getValore());
}

}

Risultato:
1 - a=4, b=7
2 - a=4, x=7
3 - a=7, x=4
4 - a=4, b=4 b è cambiato mentre a no!!!

Spero di essere stato chiaro...
Ciao