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?