Он делает именно то, что вы сказали ему делать: -)
Hotel h1 = new Hotel(100);
System.out.print(h1.getRoomNr() + " "); // 100
Hotel h2 = doStuff(h1);
System.out.print(h1.getRoomNr() + " "); // 100 - h1 is not changed, h2 is a distinct new object
System.out.print(h2.getRoomNr() + " "); // 1
h1 = doStuff(h2);
System.out.print(h1.getRoomNr() + " "); // 1 - h1 is now changed, h2 not
System.out.print(h2.getRoomNr() + " "); // 1
Как отмечали другие (и это очень четко объясняется в этой статье ), Java передается по значению. В этом случае он передает копию ссылки h1
на doStuff
. Там копия перезаписывается новой ссылкой (которая затем возвращается и присваивается h2
), но исходное значение h1
не затрагивается: она все еще ссылается на первый объект Hotel с номером комнаты 100.