il primo a mimo parere stampa 5 0 null null 0 intanto ti spiego il primo 5, cosa fa metCinque e o2.x = 5;

Allora se tu passi a un metodo una variabile di tipo primitivo (int double float char ..) il metodo non modifica la variabile che gli hai passato ma se ne fa una copia e modifica la copia quindi la variabile che tu gli hai passato, nel tuo caso i1 resta invariata, mente se un metodo come parametro vuole un oggetto o un'array questo non viene copiato e quindi viene modificato come succede negli altri casi.

l'istruzione o2.x = 5 è un'assegnazione. siccome o2 è un oggetto di tipo A (la classe che è dichiarata sopra) questo contiene delle "sotto variabili" che nel tuo caso sono pubbliche siccome sono stati dichiarate con "int x;" senza mettere la parola privat davanti, questo vuol dire che possono essere modificate dall'esterno dell oggetto.
Quindi creando un oggetto "A o1 = new A();" con l'istruzione o1.x accediamo alla variabile x contenuta in o1 e ponendola = 5 diamo il valore 5 alla x contenuta in o1;