Параметры статического метода Java - PullRequest
3 голосов
/ 28 апреля 2010

Почему следующий код возвращает 100 100 1 1 1, а не 100 1 1 1 1?

public class Hotel {
private int roomNr;

public Hotel(int roomNr) {
    this.roomNr = roomNr;
}

public int getRoomNr() {
    return this.roomNr;
}

static Hotel doStuff(Hotel hotel) {
    hotel = new Hotel(1);
    return hotel;
}

public static void main(String args[]) {
    Hotel h1 = new Hotel(100);
    System.out.print(h1.getRoomNr() + " ");
    Hotel h2 = doStuff(h1);
    System.out.print(h1.getRoomNr() + " ");
    System.out.print(h2.getRoomNr() + " ");
    h1 = doStuff(h2);
    System.out.print(h1.getRoomNr() + " ");
    System.out.print(h2.getRoomNr() + " ");
}
}

Почему, по-видимому, передается значение Hotel по значению doStuff ()?

Ответы [ 5 ]

10 голосов
/ 28 апреля 2010

Он делает именно то, что вы сказали ему делать: -)

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.

5 голосов
/ 28 апреля 2010

Ссылка на отель передается по значению.

4 голосов
/ 28 апреля 2010

Поскольку Java передает по значению. Только в этом случае значение является ссылкой на объект Hotel. Или, чтобы быть более понятным, Java передает ссылку на тот же объект, на который указывает h1. Следовательно, сам h1 не изменяется.

1 голос
/ 28 апреля 2010

Все хорошо. Внутри static Hotel doStuff(Hotel hotel) вы создаете new экземпляр Hotel, старая ссылка hotel не изменяется.

1 голос
/ 28 апреля 2010

Ссылка на отель передается по значению. Вы изменяете только локальную переменную hotel в методе doStuff и возвращаете ее, а не изменяете исходную h1. Вы могли бы изменить исходный h1 изнутри метода, если у вас был метод setRoomNr и вы вызывали hotel.setRoomNr(1) хотя ...

...