変数、オブジェクト、および参照の違いは何ですか?
たとえば、それらはすべて特定の型を指し、すべて値を保持する必要があります(もちろん、一時的なnullが可能な型を持っている場合を除きます)が、それらの機能と実装は正確にどのように異なりますか?
例:
Dog myDog = new Dog(); //variable myDog that holds a reference to object Dog
int x = 12; //variable x that hold a value of 12
それらは同じ概念を持っていますが、どのように異なっていますか?
(明確にするために、ここで説明するのはJavaとC#に固有のものです。他の言語にも当てはまるとは思わないでください。
私は自分がどこに住んでいるのかを誰かに伝えるのに似ています。住所を紙に書きます。
それは役立ちますか?
値型と参照型の違いは、紙に書かれているものです。たとえば、ここに:
int x = 12;
12の数字が直接書かれた紙を持っているようなものです。一方、
Dog myDog = new Dog();
dogオブジェクトのコンテンツ自体を紙に書き込みません。新しいDog
を作成し、その紙に犬への参照を書き込みます。
アナロジー以外の用語で:
Button
変数を持っている場合、値は常にButton
型のオブジェクトへの参照、サブクラス、またはnull
参照になります。.
演算子を使用して参照をナビゲートします。たとえば、foo
がPerson
変数である場合、foo.getAddress().getLength()
はfoo
(参照)の値を取り、その参照するオブジェクトでgetAddress()
を呼び出します。を指します。結果はString
参照になる可能性があります...次に、that参照が参照するオブジェクトでgetLength()
を呼び出します。これらの概念を説明するとき、私はしばしば次の類推を使います。
オブジェクトが風船だと想像してください。変数は人です。すべての人はvalue typeチームまたはreference typeチームに属します。そして、彼らは皆、以下のルールで小さなゲームをします:
値の種類のルール:
参照タイプのルール:
質問に答えるようなものと考えることができます。
オブジェクトは何ですか...
それは、世界の物理的なもののように、それ自体が認識可能であり、他の「もの」と区別する重要な特性を持つ「もの」です。あなたが知っているように、犬は犬がisえるので犬であり、投げると尾を動かし、ボールを追います。
変数とは...
自分の手を見るように。それぞれが手そのものです。皮膚には指、爪、骨がありますが、一方は左手で、もう一方は右手です。つまり、同じタイプ/種類の2つの「もの」を持つことができますが、それぞれが独自の方法で異なり、異なる値を持つことができます。
参照は...です
通りにある2つの家を見ると、それぞれのファサードがありますが、それぞれ1つの固有の住所でそれぞれに到達できます。つまり、3ブロック先または別の国では、家の住所を伝えることができます。直接指さなくても、家を置いた場所に残っているからです。
プログラミングのために、C++の方法の例
class Person{...}
Person Ana = new Person(); //An object is an instance of a class(normally)
つまり、アナは人ですが、彼女は他の人と区別するユニークな特性を持っています。
&Ana //This is a reference to Ana, that is to say, a "where" does the variable
//"Ana" is stored, wether or not you know it's value(s)
Ana
自体は、「Ana」という名前の人のプロパティを保存するための変数です
ジョンの答えは、類推からアプローチするのに最適です。より具体的な言葉遣いがあなたに役立つなら、私はピッチングすることができます。
変数から始めましょう。変数は、値を含む[名前付き]ものです。たとえば、int x = 3
は、整数3を含むxという名前の変数を定義します。その後、割り当てx=4
を追加すると、xには整数4が含まれるようになります。 '変数を置き換えません。新しい「値が現在4である変数x」はありません。xの値を新しい値に置き換えただけです。
それでは、オブジェクトに移動しましょう。多くの場合、多くの場所から1つの「もの」を参照する必要があるため、オブジェクトは便利です。たとえば、エディターでドキュメントを開いてプリンターに送信する場合、エディターとプリンターの両方で参照されるドキュメントが1つだけであると便利です。必要以上に何度もコピーする必要がなくなります。
ただし、2回以上コピーする必要はないため、オブジェクトを変数に入れることはできません。変数は値を保持するため、2つの変数がオブジェクトを保持する場合、変数ごとに1つずつ、2つのコピーを作成する必要があります。参照は、これを解決する中間的なものです。参照は、変数に格納できる小さなコピーしやすい値です。
したがって、コードでDog dog = new Dog()
と入力すると、new演算子は新しいDogオブジェクトを作成し、そのオブジェクトへの参照を返すため、変数に割り当てることができます。割り当ては、dog
に、新しく作成されたオブジェクトへの参照の値を与えます。
new Dog()はオブジェクトDogをインスタンス化します。つまり、オブジェクトのメモリを作成します。一部の操作を操作するには、変数にアクセスする必要があります。そのためには、Dog myDogという参照が必要です。オブジェクトを印刷しようとすると、アドレス以外の読み取り不能な値が印刷されます。
myDog -------> new Dog().