codice:
class A{
     
     int val = 100;

     static void incrementa(int i){
         i = i + 1;
     }

     static void annulla(A a){
         a.val = 0;
         a = null;
     }

     public static void main(String[] args){
          int i = 0;
          System.out.println("valore di i prima di invocare 'incrementa(i)': " + i);
          incrementa(i);
          System.out.println("valore di i dopo che è stato invocato 'incrementa(i)': " + i);
          System.out.println();
          A a = new A();
          System.out.println("valore di 'a' prima di invocare 'annulla(a)': " + a);
          System.out.println("valore di 'a.val' prima di invocare 'annulla(a)': " + a.val);
          annulla(a);
          System.out.println();
          System.out.println("valore di 'a' dopo che è stato invocato 'annulla(a)': " + a);
          System.out.println("valore di 'a.val' dopo che è stato invocato 'annulla(a)': " + a.val);

     }
}
Puoi notare che i valori di 'i' e di 'a' restano uguali prima e dopo l'invocazione dei metodi, perche questi parametri sono appunto passati per valore e restano immodificati, mentre il campo a.val viene modificato dal metodo annulla.