2011-09-13 2 views
0
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() + " "); 
    } 
} 

なぜdo1はdoStuff(h1)を呼び出した後に変更されないのですか? 私はオブジェクトへの参照を渡す必要があり、メソッドでは新しいオブジェクトに置き換える必要があることを理解しています。scjpオブジェクトを渡す

+0

はい、オブジェクトへの参照ですが、オブジェクトへの参照を保持する変数への参照ではありません。変数の値を変更するには、変数への参照を渡す必要があります(Javaでは直接使用できません) –

+0

[http://www.java2s.com/Tutorial/SCJP/0020__Java-Source-And-Data-Type/PassingObjectReferenceVariables .htm](http://www.java2s.com/Tutorial/SCJP/0020__Java-Source-And-Data-Type/PassingObjectReferenceVariables.htm)および[http://www.coderanch.com/t/269485/java-プログラマー - SCJP /認証/合格オブジェクト参照変数](http://www.coderanch.com/t/269485/java-programmer-SCJP/certification/Passing-object-reference-variables) – diyesh

答えて

1

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

変数hotel基準値を受信し、新たなローカル変数です。この新しいローカル変数には、最初の行に新しいHotelインスタンスへの新しい参照がロードされ、この新しい参照が返されます。

外側ローカル変数h1は変更されません。


main:h1 = 0x0000100      (the old Hotel's address) 
     | 
    copying 
     | 
     -------> doStuff:hotel = 0x0000100 (the method call) 
        doStuff:hotel = 0x0000200 (the new Hotel's address) 
           | 
          copying 
           | 
main:h2 = 0x0000200 <--------- 
0

オブジェクトが「参照渡しではなく値渡し」されているためです。

値によって渡されるものは参照値です。だから、あなたの目には、それが参考になったと思います。

したがって、オブジェクトにメソッドを渡すと、新しい「ポインタ参照」が作成され、渡されます。だからあなたがそれを修正しても、何も起こらない。

編集:ここにいくつかのコード

Hotel h1 = new Hotel(100); // h1 holds a reference to a Hotel object in memory 
System.out.print(h1.getRoomNr() + " "); 
Hotel h2 = doStuff(h1); // when doStuff is called, a new reference pointing to the same object is made, but if you change it, nothing will happen 

Core Javaを見てみましょう。最高の本!この部分で

0

オブジェクトへの参照が渡され、この基準値によって渡されます。これは、参照のコピーが渡されることを意味します。ホテルの内容を変更すると、これらの変更が発信者に表示されます。しかし、ホテルの議論に新しいホテルを割り当てると、元の参照のコピーのみが変更されます。元の参照は依然として元のホテルを指しています。

1

私はここで少し具体的です:参照が渡されたというよりは、それを "値渡しの参照"と考えてください。したがって、基本的に、このメソッドは、オブジェクトをポイントする参照のコピーを受け取ります。両方の参照(元のh1と新しいhotel)は同じオブジェクトを指していますが、まだ異なります。このメソッドでは、参照しているオブジェクトではなく、結果として参照されるオブジェクトではなく、「参照」を変更します。

良い読者はthis oneです。著者はさまざまな言語を使用したコードサンプルを使用しています。

関連する問題