0

同じタイプの 2 つのオブジェクトが同一の参照を持つ場合はどうなりますか?

例えば ​​-

BufferedReader bufferedReader=null;
try{
    bufferedReader = new BufferedReader(new InputStreamReader(a.openStream())); 
    while ((inputLine = bufferedReader.readLine()) != null) {
        //do something
    }

    bufferedReader = new BufferedReader(new InputStreamReader(b.openStream()));
    while ((inputLine = bufferedReader.readLine()) != null) {
        //do something
    }
}

aこの場合はbURL です。

ここにあるコードは、このページに似ています。この場合、バッファリングされたリーダー オブジェクトは最初に URL のデータを持ち、a後で のデータを持ちますbか?

4

4 に答える 4

1

あなたが本当に聞きたいことを意味するように質問を表現したとは思えません. あなたの素朴な質問に答えるために...

bufferedReaderタイプの参照がありBufferedReaderます。

1 行目で、への参照を初期化しますnull。オブジェクトを指していません。

4 行目で、bufferedReader参照先を変更します。現在は、最終的に からデータを取得するオブジェクトを指していますa

1 行 7 で、bufferedReader参照先を変更します。現在は、最終的に からデータを取得するオブジェクトを指していますb

バッファリングされたリーダー オブジェクトは、最初に URL a のデータを持ち、後で b のデータを持ちますか?

はい、コードは URL a からデータを取得し、次に URL b からデータを取得します。


同じタイプの 2 つのオブジェクトが同一の参照を持つ場合はどうなりますか?

それはもっと似ています:

Foo o1 = new Foo();
Foo o2 = o1;

次に、同じオブジェクトo1o2指します。その場合、いずれかの参照を介してメソッドを呼び出すと、同じ (単一の) オブジェクトに影響します。

于 2013-07-27T04:53:26.490 に答える
1

それは似たようなことですが、簡単な例を挙げて説明しましょう。あなたの場合は、マッピングすることができます。

int a = 10;

a = 2 + 3 ;
sysout(a);
// a have 5 right now, next line will change the contents to 9,
   so previous data within a is no longer exist.

a = 4 + 5 ;
sysout(a);

ユーザー定義型

class Student{
  private int rollNo;
 //getter-setter
}

Student s = new Student();
s.setRollNo(10);

sysout(s.getRollNo);

ここで、新しい学生のオブジェクトを作成しているのと同じ参照で、以前の学生への参照が失われ、参照が新しい学生オブジェクトを指し始めます。

s = new Student();
s.setRollNo(20);

sysout(s.getRollNo);
于 2013-07-27T04:55:45.003 に答える
0

同じ変数 (bufferedReader) は、最初の "new" の後の 1 つのオブジェクトを参照し、2 番目の "new" で 2 番目の別のオブジェクトに再割り当てされます。

また、Java ガベージ コレクターは未使用のオブジェクトを解放することにも注意してください。ただし、まだ開いているファイルは閉じません。2 番目の「新規」では、リソース リークが発生しました ;)

于 2013-07-27T04:55:53.897 に答える
0

このように考えてみてください。 new キーワードを呼び出すたびに、その後にオブジェクト クラスのコンストラクターを呼び出していることになります。これにより、ヒープ上に新しいオブジェクトが作成されます。上記のスニペットでは、これを 2 回行っています。最初 に、参照BufferedReader()用に、ストリーム a にチェーンされたオブジェクトを初期化しますbufferedReader。while ループが完了し、次の新しいキーワードをヒットすると、BufferedReaderストリーム b にチェーンされた別のオブジェクトが作成され、bufferedReader参照ハンドルがそれを指すようになります。

Java には自動ガベージ コレクションがあり、1 つの参照は一度にヒープ上の 1 つのオブジェクトしか指すことができません (配列であってもそれ自体のオブジェクトと見なされます)。したがって、参照を a にチェーンされた BufferedReader オブジェクトから b にチェーンされたオブジェクトに切り替えると、前者はガベージ コレクションされます。

左側は宣言であることに注意してください。たとえば、 Object obj1; 右側は提供された型の新しいオブジェクトを作成するための呼び出しです。たとえば obj1 = new Object(); 、中間の equals により、obj1 参照がヒープ上に新しく作成されたオブジェクトを指すようになります。それが役立つことを願っています。

于 2013-07-27T04:56:55.290 に答える