Following example:
public class MainActivity extends AppCompatActivity {
    private Button doSmth;
    private Integer myInt = 0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        doSmth = findViewById(R.id.doSmth);
        doSmth.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Counter counter = new Counter(myInt);
                counter.incrementCounter();
                Log.i("Final Counter", myInt.toString());
            }
        });
    }
}
The according Counter-class:
public class Counter {
    Integer counter;
    public Counter(Integer counter) {
        this.counter = counter;
    }
    public void incrementCounter() {
        for (int i = 0; i < 3; i++) {
            counter = i;
            Log.i("Current Counter", counter.toString());
        }
    }
}
The console-output when the onclicklistener becomes triggered:
... integerexample I/Current Counter: 0
... integerexample I/Current Counter: 1
... integerexample I/Current Counter: 2
... integerexample I/Final Counter: 0
I would have expected that Final Counter is 2. Because myInt is an Integer-object and object are passed by reference.
But obviously a copy has become passed because myInt is still 0.
Can someone explain me the above described behaviour?
Are objects of primitives wrapper-classes somehow handled differently?
 
     
    