代码之家  ›  专栏  ›  技术社区  ›  AdrianS

Java静态方法参数

  •  3
  • AdrianS  · 技术社区  · 16 年前

    为什么返回以下代码 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() + " ");
    }
    }
    

    为什么它似乎会将酒店按价值传递给dostuf()?

    5 回复  |  直到 15 年前
        1
  •  10
  •   Péter Török    15 年前

    它完全按照你告诉它做的去做:—)

    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
    

    如其他人所述(并解释得非常清楚 in this article Java通过值传递。在这种情况下,它传递引用的副本 h1 到 doStuff . 在那里,副本被一个新的引用覆盖(然后返回并分配给 h2 ,但原值为 H1 不受影响:它仍然引用房间号为100的第一个酒店对象。

        2
  •  5
  •   Roman    16 年前

    对酒店的引用按值传递。

        3
  •  4
  •   Justin Ardini    16 年前

    因为Java 做 传递值。只有在这种情况下,该值才是对 Hotel 对象。或者更清楚地说,Java传递了指向H1指向的同一对象的引用。因此,h1本身没有被修改。

        4
  •  1
  •   froadie    16 年前

    酒店引用按值传递。你只是在改变当地人 hotel 变量在 doStuff 方法并返回,而不更改原始 h1 . 你 能够 更改原件 H1 如果您有一个setroomnr方法并调用 hotel.setRoomNr(1) 虽然…

        5
  •  1
  •   fastcodejava    16 年前

    一切都很好。里面 static Hotel doStuff(Hotel hotel) ,您正在创建 new 实例 Hotel 老的 hotel 引用未更改。

    推荐文章