0

私が学んだことから、Javaのクラスオブジェクトは実際にはそれらのオブジェクトへの参照です。オブジェクト自体に変数を含めることはできず、オブジェクトへの参照のみを含めることができます。

次のC++の例を考えてみましょう。

SomeClass A(5);
SomeClass &B = A;
SomeClass &C = B;

さて、私は以下の3つのステートメントすべてがまったく同じオブジェクトを使用すると言っているのは正しいと思います:

A.someMethod(); //some object
B.someMethod(); //the same object
C.someMethod(); //the same object

ただし、Javaでは、オブジェクトは実際には参照ですが、代入演算子を使用すると、そのオブジェクトへの新しい参照を持つまったく新しいオブジェクトが作成されます。

SomeClass A = new SomeClass();
SomeClass B;
B = A;

これで、メソッド呼び出しはまったく異なるオブジェクトから呼び出されます。

A.someMethod(); //uses one object
B.someMethod(); //uses entirely different object

私が正しいか間違っているか教えてください。

4

3 に答える 3

2

Java 参照は、C++ 参照と非常によく似ています。ある参照を別の参照に割り当てても、新しいオブジェクトは作成されません。newJava では、演算子を明示的に使用した場合にのみ、新しいオブジェクトが作成されます。

補遺:

完全を期すために、String オブジェクトは独自の規則に従うことに言及する必要があります。特に、 String 定数は、 を明示的に使用しなくても、コンパイル時にオブジェクトを作成しますnew。また、オート (アン) ボクシングは、明示的に を使用せずにオブジェクトが作成される、より高度なトピックnewです。ただし、どちらの場合でも重要な点は変わりません。ある参照を別の参照に割り当てても、新しいオブジェクトは作成されません。どちらの参照も同じオブジェクトを参照しています。

于 2012-11-27T04:03:16.417 に答える
2

参照はオブジェクトとは異なります。特定のオブジェクトは、それを指す複数の参照を持つことができます。コンパイル時にクラスのメソッドを呼び出す場合、参照型にそのクラスで定義されたメソッドが含まれているかどうかが常にクラス参照でチェックされます。そうでない場合、コンパイル時エラーが発行されます。メソッドが指定されたクラスのサブクラスでオーバーライドされている場合、オーバーライドされたメソッドが実行時に呼び出されます。コンパイル時に、常に 'class-ref' in<class-ref>.method()がチェックされ、メソッド定義が含まれているかどうかが確認されます。static、final、abstract、メソッドの可視性などのその他の修飾子もコンパイル時にチェックされ、メソッド修飾子の組み合わせが間違っているとコンパイル時エラーが発生します。

    SomeClass A = new SomeClass();
    SomeClass B;
    B = A;        // Same class, same object, different reference


A.someMethod(); //uses one object
B.someMethod(); //uses the same object
于 2012-11-27T04:21:58.783 に答える
-2

Bro実際には、オブジェクト(A = B)に同じ参照を行うと、Javaがまったく異なる新しいオブジェクトを作成しているようです。しかし、実際には、Java はオブジェクトのコピーを別の参照に提供します。例のように、A と B は同じオブジェクトを参照していますが、タイプ SomeClass のそのオブジェクトの独自のコピーを持っています。C言語の値渡しのものと同じです。そのオブジェクトを使用および変更できますが、そのオブジェクトで行われた変更は元のコピーまたは他のコピーには影響しません。つまり、参照 B を使用して SomeClass オブジェクトを変更しても、参照 B のオブジェクトには影響しません。両方とも同じオブジェクトを参照していますが、独自のコピーがあります。

于 2012-11-27T04:37:09.617 に答える