
Java超|インスタンス変数とインスタンスメソッド
同じ設計図から生まれても、悟空には悟空の戦闘力があり、ベジータにはベジータの戦闘力がある。インスタンス変数とインスタンスメソッドを知ると、オブジェクトごとの情報と動きが見えてきます。
ここまでの学習で、クラスの中にはフィールド、メソッド、コンストラクタを書けることを学んできました。
クラスは、オブジェクトを作るための設計図です。
その設計図からオブジェクトを作ることで、実際に値を持たせたり、メソッドを呼び出したりできます。
ドラゴンボールの世界観でたとえると、Saiyan クラスはサイヤ人戦士の設計図です。
その設計図から、悟空やベジータのような個別の戦士オブジェクトを作れます。
ここで大切になるのが、そのフィールドやメソッドは、どのオブジェクトに結びついているのかという考え方です。
同じ Saiyan クラスから作られた戦士でも、悟空の戦闘力とベジータの戦闘力は別々です。
悟空に show() を呼び出せば悟空の状態が表示され、ベジータに show() を呼び出せばベジータの状態が表示されます。
このように、オブジェクトごとに結びついているフィールドをインスタンス変数といいます。
そして、オブジェクトごとに呼び出して使うメソッドをインスタンスメソッドといいます。
この記事では、具体的なプログラムとして Sample7.java を例示しながら、インスタンス変数とインスタンスメソッドの関係を、サイヤ人戦士の状態管理として整理していきます。
クラスのメンバはオブジェクトと結びついて使われる
クラスの中には、フィールドやメソッドがあります。
フィールドは、オブジェクトが持つ情報です。
メソッドは、オブジェクトが行う処理です。
この2つをまとめてメンバと呼びます。
| メンバ | 役割 | ドラゴンボールでたとえると |
|---|---|---|
| フィールド | 情報を持つ | 名前、戦闘力、気の量、流派 |
| メソッド | 処理を行う | 状態設定、状態表示 |
| メンバ | フィールドとメソッドの総称 | 戦士の情報と技 |

たとえば Saiyan クラスには、次のようなフィールドとメソッドを用意できます。
| 種類 | 例 | 役割 |
|---|---|---|
| フィールド | name | 戦士の名前を持つ |
| フィールド | power | 戦闘力を持つ |
| フィールド | kiEnergy | 気の量を持つ |
| フィールド | styleMark | 流派の印を持つ |
| フィールド | styleName | 流派名を持つ |
| メソッド | setSaiyan() | 戦士の状態を設定する |
| メソッド | show() | 現在の状態を表示する |
これらは、ただクラスに書かれているだけではありません。
Saiyan クラスから goku オブジェクトを作れば、goku の name、power、kiEnergy、styleMark、styleName ができます。
Saiyan クラスから vegeta オブジェクトを作れば、vegeta の name、power、kiEnergy、styleMark、styleName ができます。
つまり、同じクラスに書かれたフィールドでも、実際には各オブジェクトに結びついて使われます。
流派情報もオブジェクトごとに持てる
今回のプログラムでは、戦闘力や気の量だけでなく、流派情報もフィールドとして持たせます。
| styleMark | styleName |
|---|---|
| 亀 | 亀仙流 |
| 鶴 | 鶴仙流 |
| 武 | 武泰斗流 |
| 塔 | カリン流 |
| 魔 | ピッコロ魔族流 |
| 神 | 神流(ナメック流) |
| 惑 | 惑星戦士流 |
| 界 | 北の界王流 |
たとえば、悟空には 亀 と 亀仙流 を持たせます。
ベジータには 惑 と 惑星戦士流 を持たせます。
同じ Saiyan クラスから作っても、悟空とベジータでは流派情報を別々に持てます。
| オブジェクト | styleMark | styleName |
|---|---|---|
| goku | 亀 | 亀仙流 |
| vegeta | 惑 | 惑星戦士流 |
このように、オブジェクトごとに別々の情報を持てることが、インスタンス変数を理解する大切な入口です。
図:同じクラスから別々の戦士オブジェクトが作られる

この図が示していること
この図では、Saiyan クラスという同じ設計図から、goku オブジェクトと vegeta オブジェクトが作られる流れを表しています。
どちらも name、power、kiEnergy、styleMark、styleName という同じ種類のフィールドを持てます。
しかし、goku は悟空、9000、20.5、亀、亀仙流 という値を持ちます。
vegeta はベジータ、8500、30.5、惑、惑星戦士流 という値を持ちます。
ここから分かるのは、インスタンス変数はクラス全体で1つだけ共有されるのではなく、オブジェクトごとに別々の値を持つということです。
オブジェクトごとの値を確認する
実際のプログラムで確認してみましょう。
ファイル名:Sample7.java
class Saiyan
{
private String name;
private int power;
private double kiEnergy;
private String styleMark;
private String styleName;
public Saiyan()
{
name = "未設定";
power = 0;
kiEnergy = 0.0;
styleMark = "未";
styleName = "未設定";
System.out.println("戦士を作成しました。");
}
public void setSaiyan(String n, int p, double e, String mark, String style)
{
name = n;
power = p;
kiEnergy = e;
styleMark = mark;
styleName = style;
System.out.println("戦士の名前を" + name + "にしました。");
System.out.println("戦闘力を" + power + " 気の量を" + kiEnergy + "にしました。");
System.out.println("流派の印を「" + styleMark + "」 流派名を" + styleName + "にしました。");
}
public void show()
{
System.out.println("戦士の名前は" + name + "です。");
System.out.println("戦闘力は" + power + "です。");
System.out.println("気の量は" + kiEnergy + "です。");
System.out.println("流派の印は「" + styleMark + "」です。");
System.out.println("流派名は" + styleName + "です。");
}
}
class Sample7
{
public static void main(String[] args)
{
Saiyan goku = new Saiyan();
goku.setSaiyan("悟空", 9000, 20.5, "亀", "亀仙流");
goku.show();
Saiyan vegeta = new Saiyan();
vegeta.setSaiyan("ベジータ", 8500, 30.5, "惑", "惑星戦士流");
vegeta.show();
}
}このプログラムでは、Saiyan クラスから2つのオブジェクトを作っています。
| オブジェクト | 作り方 |
|---|---|
| goku | new Saiyan() |
| vegeta | new Saiyan() |
どちらも同じ Saiyan クラスから作られています。
しかし、設定される値は別々です。
goku オブジェクトには悟空の値が入る
main メソッドの前半では、goku に対して次の処理をしています。
Saiyan goku = new Saiyan();
goku.setSaiyan("悟空", 9000, 20.5, "亀", "亀仙流");
goku.show();この流れで、goku オブジェクトには次の値が設定されます。
| フィールド | goku の値 |
|---|---|
| name | 悟空 |
| power | 9000 |
| kiEnergy | 20.5 |
| styleMark | 亀 |
| styleName | 亀仙流 |
ここで大切なのは、goku が持っている値は、goku オブジェクト自身に結びついているということです。
つまり、goku の power は 9000 です。
goku の kiEnergy は 20.5 です。
goku の流派は 亀仙流 です。
これは、あとから vegeta オブジェクトを作っても、勝手に混ざりません。
vegeta オブジェクトにはベジータの値が入る
次に、vegeta に対して次の処理をしています。
Saiyan vegeta = new Saiyan();
vegeta.setSaiyan("ベジータ", 8500, 30.5, "惑", "惑星戦士流");
vegeta.show();この流れで、vegeta オブジェクトには次の値が設定されます。
| フィールド | vegeta の値 |
|---|---|
| name | ベジータ |
| power | 8500 |
| kiEnergy | 30.5 |
| styleMark | 惑 |
| styleName | 惑星戦士流 |
goku と vegeta は、同じ Saiyan クラスから作られています。
しかし、goku には goku の name、power、kiEnergy、styleMark、styleName があります。
vegeta には vegeta の name、power、kiEnergy、styleMark、styleName があります。
| オブジェクト | name | power | kiEnergy | styleMark | styleName |
|---|---|---|---|---|---|
| goku | 悟空 | 9000 | 20.5 | 亀 | 亀仙流 |
| vegeta | ベジータ | 8500 | 30.5 | 惑 | 惑星戦士流 |
ドラゴンボールでたとえると、同じサイヤ人戦士の設計図から悟空とベジータが生まれても、悟空の戦闘力とベジータの戦闘力は別々です。
悟空の気の量とベジータの気の量も、それぞれ別々に存在します。
フィールドがオブジェクトに関連づけられているという意味
フィールドは、クラスの中に1回だけ書かれています。
private String name;
private int power;
private double kiEnergy;
private String styleMark;
private String styleName;しかし、実際にオブジェクトを作ると、そのフィールドはオブジェクトごとに値を持ちます。
つまり、次のように考えると分かりやすいです。
| クラスに書かれているフィールド | 実際のイメージ |
|---|---|
| name | goku の name、vegeta の name |
| power | goku の power、vegeta の power |
| kiEnergy | goku の kiEnergy、vegeta の kiEnergy |
| styleMark | goku の styleMark、vegeta の styleMark |
| styleName | goku の styleName、vegeta の styleName |
power という項目は、Saiyan クラスに共通してあります。
しかし、goku の power と vegeta の power は別々です。
ドラゴンボールでたとえると、戦闘力という項目はサイヤ人戦士なら共通して持っています。
でも、悟空の戦闘力とベジータの戦闘力は同じものではありません。
このように、フィールドが各オブジェクトに結びついていることを、フィールドがオブジェクトに関連づけられていると考えます。
インスタンス変数とは何か
各オブジェクトに関連づけられているフィールドのことを、インスタンス変数といいます。
今回の Sample7.java では、次の5つがインスタンス変数です。
| インスタンス変数 | 役割 |
|---|---|
| name | 各戦士の名前を持つ |
| power | 各戦士の戦闘力を持つ |
| kiEnergy | 各戦士の気の量を持つ |
| styleMark | 各戦士の流派の印を持つ |
| styleName | 各戦士の流派名を持つ |
これらは、オブジェクトを作ってはじめて具体的な値を持ちます。
Saiyan クラスの段階では、名前を持てる、戦闘力を持てる、気の量を持てる、流派情報を持てるという設計があるだけです。
実際に goku や vegeta というオブジェクトを作ることで、それぞれに具体的な値が入ります。
| オブジェクト | name | power | kiEnergy | styleMark | styleName |
|---|---|---|---|---|---|
| goku | 悟空 | 9000 | 20.5 | 亀 | 亀仙流 |
| vegeta | ベジータ | 8500 | 30.5 | 惑 | 惑星戦士流 |
インスタンス変数という言葉は少し長く感じるかもしれません。
でも、意味はシンプルです。
各インスタンス、つまり各オブジェクトにひもづく変数です。
ドラゴンボールでたとえると、それぞれの戦士が自分専用に持っている名前、戦闘力、気の量、流派情報です。
図:インスタンス変数はオブジェクトごとに別々

この図が示していること
この図では、goku オブジェクトと vegeta オブジェクトが、それぞれ別々のインスタンス変数を持っていることを示しています。
どちらも Saiyan クラスから作られています。
そのため、どちらも name、power、kiEnergy、styleMark、styleName という同じ種類の情報を持てます。
しかし、実際の値はオブジェクトごとに別々です。
goku の power は 9000 です。
vegeta の power は 8500 です。
ここから分かるのは、インスタンス変数はクラスに1つだけある共有データではなく、各オブジェクト自身が持つ専用の情報だということです。
メソッドもオブジェクトに関連づけられている
フィールドだけではありません。
メソッドも、オブジェクトに関連づけられて使われます。
たとえば、次のように書くと、goku に対して show() を呼び出します。
goku.show();この場合、表示されるのは goku の name、power、kiEnergy、styleMark、styleName です。
一方で、次のように書くと、vegeta に対して show() を呼び出します。
vegeta.show();この場合、表示されるのは vegeta の name、power、kiEnergy、styleMark、styleName です。
show() の定義は、Saiyan クラスの中に1つだけです。
public void show()
{
System.out.println("戦士の名前は" + name + "です。");
System.out.println("戦闘力は" + power + "です。");
System.out.println("気の量は" + kiEnergy + "です。");
System.out.println("流派の印は「" + styleMark + "」です。");
System.out.println("流派名は" + styleName + "です。");
}しかし、どのオブジェクトに対して呼び出すかによって、使われる値が変わります。
| 呼び出し | 表示される情報 |
|---|---|
| goku.show() | goku の name、power、kiEnergy、styleMark、styleName |
| vegeta.show() | vegeta の name、power、kiEnergy、styleMark、styleName |
ドラゴンボールでたとえると、悟空に状態報告をさせれば悟空の状態が報告されます。
ベジータに状態報告をさせればベジータの状態が報告されます。
同じ show() という技でも、誰に使わせるかによって見える状態が変わるのです。
インスタンスメソッドとは何か
各オブジェクトに関連づけられているメソッドのことを、インスタンスメソッドといいます。
今回の Sample7.java では、次の2つがインスタンスメソッドです。
| インスタンスメソッド | 役割 |
|---|---|
| setSaiyan(String n, int p, double e, String mark, String style) | そのオブジェクトの状態を設定する |
| show() | そのオブジェクトの状態を表示する |
これらは、オブジェクトを作ってから、そのオブジェクトに対して呼び出します。
goku.setSaiyan("悟空", 9000, 20.5, "亀", "亀仙流");
goku.show();
vegeta.setSaiyan("ベジータ", 8500, 30.5, "惑", "惑星戦士流");
vegeta.show();ここで重要なのは、どのオブジェクトに対して呼び出しているかです。
goku.setSaiyan("悟空", 9000, 20.5, "亀", "亀仙流") は、goku の値を設定します。
vegeta.setSaiyan("ベジータ", 8500, 30.5, "惑", "惑星戦士流") は、vegeta の値を設定します。
同じ setSaiyan() でも、呼び出す相手によって、変更されるオブジェクトが違います。
ドラゴンボールでたとえると、同じ戦士の状態を整える技でも、悟空に使えば悟空の状態が整い、ベジータに使えばベジータの状態が整うということです。
インスタンス変数とインスタンスメソッドはセットで考える
インスタンス変数とインスタンスメソッドは、別々に覚えるより、セットで考えると分かりやすいです。
どちらもオブジェクトに結びついているからです。
| メンバ | オブジェクトに関連づくか | 種類 |
|---|---|---|
| name | はい | インスタンス変数 |
| power | はい | インスタンス変数 |
| kiEnergy | はい | インスタンス変数 |
| styleMark | はい | インスタンス変数 |
| styleName | はい | インスタンス変数 |
| setSaiyan() | はい | インスタンスメソッド |
| show() | はい | インスタンスメソッド |
ドラゴンボールでたとえると、こうなります。
| Javaの用語 | ドラゴンボールでたとえると |
|---|---|
| インスタンス変数 | その戦士自身の名前、戦闘力、気の量、流派情報 |
| インスタンスメソッド | その戦士自身に使わせる状態設定や状態報告の技 |
つまり、インスタンス変数は、そのオブジェクト自身の情報です。
インスタンスメソッドは、そのオブジェクト自身の情報を使って動く処理です。
この2つは、オブジェクトごとの状態と動きを表す大切なペアです。
実行結果からオブジェクトごとの違いを見る
Sample7.java を実行すると、次のような結果になります。
戦士を作成しました。
戦士の名前を悟空にしました。
戦闘力を9000 気の量を20.5にしました。
流派の印を「亀」 流派名を亀仙流にしました。
戦士の名前は悟空です。
戦闘力は9000です。
気の量は20.5です。
流派の印は「亀」です。
流派名は亀仙流です。
戦士を作成しました。
戦士の名前をベジータにしました。
戦闘力を8500 気の量を30.5にしました。
流派の印を「惑」 流派名を惑星戦士流にしました。
戦士の名前はベジータです。
戦闘力は8500です。
気の量は30.5です。
流派の印は「惑」です。
流派名は惑星戦士流です。前半は、goku の情報です。
| 表示内容 | 対象 |
|---|---|
| 戦士の名前を悟空にしました。 | goku |
| 戦闘力を9000 気の量を20.5にしました。 | goku |
| 流派の印を「亀」 流派名を亀仙流にしました。 | goku |
| 戦士の名前は悟空です。 | goku |
| 戦闘力は9000です。 | goku |
| 気の量は20.5です。 | goku |
| 流派名は亀仙流です。 | goku |
後半は、vegeta の情報です。
| 表示内容 | 対象 |
|---|---|
| 戦士の名前をベジータにしました。 | vegeta |
| 戦闘力を8500 気の量を30.5にしました。 | vegeta |
| 流派の印を「惑」 流派名を惑星戦士流にしました。 | vegeta |
| 戦士の名前はベジータです。 | vegeta |
| 戦闘力は8500です。 | vegeta |
| 気の量は30.5です。 | vegeta |
| 流派名は惑星戦士流です。 | vegeta |
この結果を見ると、goku と vegeta の値が混ざっていないことが分かります。
goku には goku の name、power、kiEnergy、styleMark、styleName があります。
vegeta には vegeta の name、power、kiEnergy、styleMark、styleName があります。
同じ Saiyan クラスから作っても、オブジェクトごとに状態は別々です。
show() は呼び出した相手の状態を表示する
show() も、オブジェクトごとに働きます。
Sample7.java の show() は、次のように定義されています。
public void show()
{
System.out.println("戦士の名前は" + name + "です。");
System.out.println("戦闘力は" + power + "です。");
System.out.println("気の量は" + kiEnergy + "です。");
System.out.println("流派の印は「" + styleMark + "」です。");
System.out.println("流派名は" + styleName + "です。");
}この中では、name、power、kiEnergy、styleMark、styleName を表示しています。
ただし、どの name、power、kiEnergy、styleMark、styleName を使うかは、どのオブジェクトに対して show() を呼んだかで決まります。
goku.show();なら、goku の状態を表示します。
vegeta.show();なら、vegeta の状態を表示します。
| 呼び出し | 使われる値 |
|---|---|
| goku.show() | goku の name、power、kiEnergy、styleMark、styleName |
| vegeta.show() | vegeta の name、power、kiEnergy、styleMark、styleName |
ドラゴンボールでたとえると、悟空に報告させれば悟空の状態が分かります。
ベジータに報告させればベジータの状態が分かります。
同じ報告の技でも、誰が使うかで中身が変わります。
図:インスタンスメソッドは呼び出した相手に働く

この図が示していること
この図では、同じ show() メソッドでも、呼び出した相手によって表示される情報が変わることを示しています。
goku.show() では、goku オブジェクトの name、power、kiEnergy、styleMark、styleName が使われます。
そのため、悟空の名前、戦闘力、気の量、流派情報が表示されます。
一方で、vegeta.show() では、vegeta オブジェクトの name、power、kiEnergy、styleMark、styleName が使われます。
そのため、ベジータの名前、戦闘力、気の量、流派情報が表示されます。
ここから分かるのは、インスタンスメソッドは、呼び出したオブジェクト自身の状態を使って働くということです。
各オブジェクトごとに持つという感覚が大切
インスタンス変数とインスタンスメソッドを理解するときに、いちばん大切なのは、各オブジェクトごとに持つという感覚です。
Saiyan クラスという設計図は1つです。
しかし、その設計図から作られるオブジェクトは1つとは限りません。
goku も作れます。
vegeta も作れます。
そのとき、名前、戦闘力、気の量、流派情報は共通の1つを使い回しているわけではありません。
| 項目 | 考え方 |
|---|---|
| name | 各オブジェクトごとに別々 |
| power | 各オブジェクトごとに別々 |
| kiEnergy | 各オブジェクトごとに別々 |
| styleMark | 各オブジェクトごとに別々 |
| styleName | 各オブジェクトごとに別々 |
| setSaiyan() | 呼び出したオブジェクトに対して働く |
| show() | 呼び出したオブジェクトの状態を表示する |
ドラゴンボールでたとえると、サイヤ人戦士という設計図は共通です。
しかし、悟空には悟空の名前、戦闘力、気の量、流派があります。
ベジータにはベジータの名前、戦闘力、気の量、流派があります。
悟空に状態設定をすれば悟空の状態が変わります。
ベジータに状態設定をすればベジータの状態が変わります。
この オブジェクトごと という感覚が、インスタンスを理解する中心です。
いちばん大事な感覚
インスタンス変数とインスタンスメソッドで大切なのは、次の感覚です。
| ポイント | 内容 |
|---|---|
| インスタンス変数 | オブジェクトごとに別々の値を持つフィールド |
| インスタンスメソッド | オブジェクトごとに呼び出して使うメソッド |
| 同じクラスから作っても | オブジェクトごとに中身は別々 |
| show() の動き | 呼び出したオブジェクト自身の値を表示する |
| setSaiyan() の動き | 呼び出したオブジェクト自身の値を変更する |
| 大切な見方 | クラスではなく、どのオブジェクトに結びついているかを見る |
ドラゴンボールでたとえると、同じサイヤ人戦士の設計図から生まれても、悟空とベジータは別々の戦士です。
悟空の戦闘力とベジータの戦闘力は別々です。
悟空の気の量とベジータの気の量も別々です。
悟空に show() を使えば悟空の状態が見え、ベジータに show() を使えばベジータの状態が見えます。
この感覚がつかめると、クラスとオブジェクトの関係がさらに立体的に見えてきます。
インスタンス変数とインスタンスメソッドは、各オブジェクト自身の情報と動きを表す、とても大切な考え方です。
