こんにちは、アミーゴ!変数の内部構造についてお話したいと思います。すでにご存知のとおり、各変数は、その値が保存されるメモリ領域に関連付けられています。

「はい。それについては前回もお話しましたね。」

「すごいですね。覚えていてくれて良かったです。では、続けます。」

「すべての複合型は、より単純な型で構成されます。そして、複合型は、さらに単純な型で構成されます。最終的には、これ以上単純化できないプリミティブ型に行き着きます。それが、それらをプリミティブ型と呼ぶものです。たとえば、intはプリミティブ型ですが、Stringはデータを文字のテーブルとして格納する複合型です (各文字はプリミティブ型 charです)。

「とても興味深いですね。続けてください。」

「複合型は、単純なものをグループ化することによって形成されます。このような型をクラスと呼びます。プログラムで新しいクラスを定義するとき、新しい複合データ型を宣言します。そのデータは、他の複合型またはプリミティブ型のいずれかになります。」

Javaコード 説明
public class Person
{
   String name;
   int age;
}
新しい複合型が宣言されます – Person
そのデータはString(複合型)変数nameint(プリミティブ型)変数に格納されます。age
public class Rectangle
{
   int x, y, width, height;
}
新しい複合型が宣言されます – Rectangle。4 つの(プリミティブ型) 変数
で構成されます。int
public class Cat
{
   Person owner;
   Rectangle territory;
   int age;
   String name;
}
新しい複合型が宣言されます – Cat。次の変数があります:
owner、複合タイプPerson
territory、複合タイプRectangle
age、プリミティブ タイプint
name、複合タイプString

「今のところ、どんなに奇妙に思えても、すべてが明らかです。」

「大きな (複合) 型には、多くの小さな (プリミティブ) 型が含まれています。そのため、これらの型のオブジェクトは、プリミティブ型の変数よりも多くのメモリを消費します。場合によっては、さらに多くのメモリを消費します。このような変数を使用した代入演算の実行には、以前は長い時間がかかりました」時間がかかり、メモリの大部分のコピーが必要でした。そのため、複合型の変数はオブジェクト自体を格納せず、オブジェクトへの参照、つまり 4 バイトのアドレスのみを格納します。このようなオブジェクト内のデータをアドレス指定するには、これで十分です。 Java マシンは、関連するすべての複雑さを処理します。」

「それは何も分かりませんでした。」

「変数は箱のようなものだと前に言いました。変数に 13 という数字を格納したい場合は、紙に 13 と書いて箱の中に入れればよいのです。」

「しかし、より大きなものを箱(変数)に入れる必要があると想像してください。たとえば、犬、車、隣人などです。押し込めないものを箱に押し込む代わりに、もっと簡単なことを行うことができます。写真を使用することです。実際の犬の代わりに犬の名前、本物の車の代わりにナンバープレート、または隣人の代わりに隣人の電話番号。」

「私たちは紙を用意し、隣人の電話番号を書き留めます。これは物体への参照のようなものです。隣人の電話番号が書かれた紙をコピーしていくつかの箱に入れると、さらに多くの参照が存在します。 「あなたの隣人に。しかし、以前と同じように、あなたの隣人はまだ一人だけです。それは当然ですよね?」

"この方法でデータを保存する重要な特徴は、単一のオブジェクトへの参照を多数保持できることです。"

「興味深いですね! ほぼ理解できました。もう一度教えてください – 複合型の変数を同じ複合型の別の変数に代入するとどうなりますか?」

「その場合、2 つの変数には同じアドレスが格納されます。つまり、1 つの変数が参照するオブジェクトのデータを変更すると、もう 1 つの変数が参照するデータも変更されます。両方の変数は同じオブジェクトを参照します。もちろん、多数の変数が存在する可能性があります。それへの参照も保存する他の変数。」

「複合 (参照/クラス) 型の変数がオブジェクトへの参照を保持していない場合、変数はどうなるのでしょうか? それは可能でしょうか?」

「はい、アミーゴ。あなたは私の質問を先回りしています。それは可能です。参照 (複合) 型の変数がオブジェクトへの参照を格納していない場合、その変数にはいわゆる「null」が格納されます。基本的に、これは、アドレスが 0 のオブジェクトを参照することを意味します。ただし、Java マシンは、このアドレスを持つオブジェクトを作成することはありません。そのため、参照変数に 0 が含まれている場合は、その変数がどのオブジェクトも指していないことを常に認識します。 。」

Javaコード 説明
String s;
String s = null;
同等のステートメント。
Person person;
person = new Person();
person = null;
値が null の person 変数を作成します。
新しく作成した Person オブジェクトのアドレスをそれに割り当てます。
変数に null を代入します。
Cat cat = new Cat();
cat.owner = new Person();
cat.owner.name = "God";
Cat オブジェクトを作成し、そのアドレスを変数 cat に保存します。cat.owner は null に等しい。
cat.owner を新しく作成した Person オブジェクトのアドレスに設定します。
cat.owner.name は依然として null と等しくなります。
cat.owner.name を「God」に設定します。

「正しく理解できましたか? 変数は、プリミティブ型と参照型の 2 つの型に分類されます。プリミティブ型は値を直接保存しますが、参照型はオブジェクトへの参照を保存します。プリミティブ型には、int、char、boolean などが含まれます。タイプには他のすべてが含まれます。クラスを使用して作成します。」

「あなたは本当に正しいです、坊や。」

「それで、あなたはすべてを理解したと言います。知識を強化するのに役立ついくつかのタスクを次に示します。」