ホームページ >Java >&#&チュートリアル >オブジェクトと参照の間のいくつかの基本概念
オブジェクトと参照に関するいくつかの基本概念。
初めて Java を学んだとき、長い間、基本的な概念が非常に曖昧だと常に感じていました。後で知ったのですが、多くの Java 書籍では、オブジェクトとオブジェクト参照が混同されています。しかし、オブジェクトとオブジェクト参照を区別できないと、次のオブジェクト指向技術をよく理解できません。自分の知識の一部を書き留めておくと、Java を初めて使用する友人が回り道をしなくて済むようになるかもしれません。
}
このテンプレートを使用してオブジェクトを作成できます:
Vehicle veh1 = new Vehicle();
通常、このステートメントのアクションはオブジェクトの作成と呼ばれます。実際には、4 つのアクションが含まれています。
1) 右側の「新しい Vehicle」は、Vehicle クラスをテンプレートとして使用して、ヒープ領域に Vehicle クラス オブジェクト (Vehicle オブジェクトとも呼ばれる) を作成します。
2) 最後の () は、オブジェクトの作成後、Vehicle クラスのコンストラクターがすぐに呼び出され、新しく生成されたオブジェクトを初期化することを意味します。必ずコンストラクターが存在します。これを記述しない場合、Java によってデフォルトのコンストラクターが追加されます。
3) 左側の「Vehicle veh 1」は、Vehicle クラス参照変数を作成します。いわゆる Vehicle クラス参照は、将来 Vehicle オブジェクトを指すために使用できるオブジェクト参照です。
4) 「=」演算子は、オブジェクト参照が作成したばかりの Vehicle オブジェクトを指すようにします。
このステートメントは 2 つの部分に分割できます:
Vehicle veh1;
veh1 = new Vehicle();
効果は同じです。このように書くと、2 つのエンティティがあることがより明確になります。1 つはオブジェクト参照変数で、もう 1 つはオブジェクト自体です。
ヒープ空間に作成されるエンティティは、データセグメントやスタック空間に作成されるエンティティとは異なります。それらは実在しますが、私たちは見ることも触れることもできません。それだけではなく、
2 番目の文を注意深く調べて、今作成したオブジェクトの名前を調べてみましょう。それを「ビークル」と呼ぶ人もいます。いいえ、「Vehicle」はクラス (オブジェクトの作成テンプレート) の名前です。
Vehicle クラスは無数のオブジェクトを作成できますが、これらのオブジェクトをすべて「Vehicle」と呼ぶことはできません。
オブジェクトには名前すらないため、直接アクセスすることはできません。オブジェクト参照を通じて間接的にのみオブジェクトにアクセスできます。
オブジェクト、参照、およびそれらの間の関係を生き生きと説明するために、あまり適切ではないかもしれない比喩を作ることができます。その物体は非常に大きな風船のようなもので、大きすぎて私たちには捕まえることができません。参照変数は、風船を結ぶために使用できるロープです。
最初のステートメントのみが実行され、2 番目のステートメントが実行されない場合、このとき作成される参照変数 veh1 はオブジェクトを指しておらず、その値は null になります。参照変数はオブジェクトを指すことも、null にすることもできます。
それはロープ、まだどの風船にも結ばれていないロープです。 2 番目の文を実行した後、新しい風船が作成され、ロープ veh1 に結び付けられます。ロープを掴むときは風船を掴むことになります。
別の文: h vehicle veh2;
は別のロープを作り、ボールをプレーしませんでした。別の文を追加すると:
veh2 = veh1;
は同点です。ここで、コピー動作が発生します。ただし、オブジェクト自体はコピーされず、オブジェクト参照のみがコピーされることに注意してください。その結果、veh2 も veh1 が指すオブジェクトを指します。 2 本のロープは同じ風船に結び付けられます。
次の文を使用して別のオブジェクトを作成すると:
veh2 = new Vehicle();
、参照変数 veh2 は 2 番目のオブジェクトを指すように変更されます。
上記の説明から推論すると、次の結論が得られます。
(1) オブジェクト参照は 0 または 1 つのオブジェクトを指すことができます (ロープを風船に結び付けることはできません、または風船に結び付けることはできます) );
(2) オブジェクトは、それを指す N 個の参照を持つことができます (バルーンを結ぶための N 個のロープが存在する可能性があります)。
次のステートメントを使用して using を使用します。
上記の推論によれば、veh1 は 2 番目のオブジェクトも指します。問題ない。問題は、最初のオブジェクトがどこにあるのかということです。それを保持するロープがなかったため、飛んでいきました。ほとんどの本には、Java のガベージ コレクション メカニズムによってリサイクルされると記載されています。
それは正確ではありません。正しく言えば、ガベージコレクションの対象になっています。実際にいつリサイクルされるかについては、ガベージ収集メカニズムの気分によって異なります。
このことから、次の発言は違法であると考えられますよね?少なくともそれは無駄ですよね?
新しい車両();
不正解です。合法で利用可能です。たとえば、印刷のためだけにオブジェクトを作成する場合、それを参照変数に結び付ける必要はありません。最も一般的なのは、文字列を出力することです:
System.out.println("I am Java!");
文字列オブジェクト「I am Java!」は、出力後に破棄されます。この種のオブジェクトを一時オブジェクトと呼ぶ人もいます。
以上がオブジェクトと参照の間のいくつかの基本概念の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。