マンガで分かる Java入門講座

第7章 クラスとオブジェクト1
7-7. new インスタンス オブジェクト

クラスからオブジェクトがどのようにして作成されるかを、多くの図と共に紹介します。

● オブジェクトの作成

 前回作成したMyClassを使い、オブジェクトを作成してみます。

 ソースコードは、前回MyClassを作成した、Sampleプロジェクトの「src/sample/Sample.java」に書きます。

ソースコード)オブジェクトの作成 src/sample/Sample.java
package sample;

public class Sample {
    public static void main(String[] args) {
        MyClass mc = new MyClass();
    }
}

 以下、オブジェクトの作成部分を抜粋します。

ソースコード)オブジェクトの作成 抜粋
MyClass mc = new MyClass();

 オブジェクト用の変数の作成は以下のように書きます。参照型の「型」は「クラス」になります。

説明)オブジェクト用の変数の作成
クラス 変数 = new クラス();

 この時、クラスの後には「( )」が付いています。これは、これまで出て来た命令と同じ「命令( )」という用法の「( )」です。

 この括弧には、引数と呼ばれる値が設定されることがあります。

説明)クラスの引数
クラス(値)
クラス(値, 値, …)

 こういった括弧の使い方は、今後出てくるメソッドの話で、詳しく説明します。


● newとインスタンス確保

 Javaの「new」は、インスタンスを確保して、オブジェクトの参照を作成する演算子です。

 このnewを利用すると、メモリ上に「インスタンス」と呼ばれる、フィールドの保存場所が新たに確保されて、オブジェクトが作成されます。

 インスタンスは、newでオブジェクトを作成するごとに、新たにメモリ上に確保されます。

ソースコード)newとインスタンス確保
MyClass mc1 = new MyClass();
MyClass mc2 = new MyClass();

図)newとインスタンス確保
┏クラス━━━━━┓           ┏メモリ━━━━━━━━━┓
┃        ┃           ┃            ┃
┃private     ┃public     →→→┃┏ mc1用インスタンス━┓┃
┠─●フィールド ┠─○フィールド →→→┃┃・変数1  ・変数A  ┃┃
┃  ・変数1   ┃  ・変数A   →→→┃┃・変数2  ・変数B  ┃┃
┃  ・変数2   ┃  ・変数B      ┃┗━━━━━━━━━━┛┃
┃        ┃        →→→┃┏ mc2用インスタンス━┓┃
┠─●メソッド  ┠─○メソッド  →→→┃┃・変数1  ・変数A  ┃┃
┃  ・メソッド1 ┃  ・メソッドA →→→┃┃・変数2  ・変数B  ┃┃
┃  ・メソッド2 ┃  ・メソッドB    ┃┗━━━━━━━━━━┛┃
┗━━━━━━━━┛           ┗━━━━━━━━━━━━┛

● Javaのオブジェクト

 Javaのオブジェクトは、メモリ上に確保されたインスタンスと、クラスのメソッドで構成されています。

図)Javaのオブジェクト
┏オブジェクト━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃┏メモリ━━━━━━━━┓┏クラス━━━━━┓        ┃
┃┃┏インスタンス━━━┓┃┃        ┃        ┃
┃┃┃private  public ┃┃┃private     ┃public     ┃
┃┃┃・変数1  ・変数A ┃┃┠─●メソッド  ┠─○メソッド  ┃
┃┃┃・変数2  ・変数B ┃┃┃  ・メソッド1 ┃  ・メソッドA ┃
┃┃┗━━━━━━━━━┛┃┃  ・メソッド2 ┃  ・メソッドB ┃
┃┗━━━━━━━━━━━┛┗━━━━━━━━┛        ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

 オブジェクトを格納した変数からは、外部に公開されているpublicなフィールドとメソッドが利用できます。

図)Javaのオブジェクトの見た目
┏オブジェクト━━┓
┃        ┃
┃        ┃public
┃        ┠─○フィールド
┃   隠蔽   ┃  ・変数A
┃        ┃  ・変数B
┃  ブラック  ┃
┃  ボックス  ┠─○メソッド
┃        ┃  ・メソッドA
┃        ┃  ・メソッドB
┗━━━━━━━━┛

● オブジェクトのフィールドの利用

 Javaのオブジェクトのフィールドは、「変数.フィールド名」で利用できます。こう書くことで、インスタンスの値や参照を読み書きできます。

図)オブジェクトのフィールドの利用
変数.変数A─────────────┐publicな
                  │変数を
    ┏メモリ━━━━━━━━┓ │参照
    ┃┏インスタンス━━━┓┃ │
    ┃┃private  public ┃┃ │
    ┃┃・変数1  ・変数A ←──┘
    ┃┃・変数2  ・変数B ┃┃
    ┃┗━━━━━━━━━┛┃
    ┗━━━━━━━━━━━┛

● オブジェクトのメソッドの利用

 Javaのオブジェクトのメソッドは、「変数.メソッド名()」で利用できます。

 呼び出されたpublicなメソッドは、オブジェクト内の他のメソッドやフィールドを自由に利用できます。このメソッドやフィールドは、publicでもprivateでも構いません。

 この時、利用できるフィールドは、各オブジェクト毎に確保された、インスタンス内のフィールドのみになります。他のオブジェクトのフィールドにはアクセスできません。そのため各オブジェクトは、内部で完結した、ひとまとまりの物として扱えます。

図)オブジェクトのpublicなメソッドの利用
変数.メソッドA()───────────────────┐publicな
                           │メソッドを
 ┏メモリ━━━━━━━━┓┏クラス━━━━━┓   │参照
 ┃┏インスタンス━━━┓┃┃        ┃   │
 ┃┃private  public ┃┃┃private     ┃   │
 ┃┃・変数1  ・変数A ┃┃┠─●メソッド  ┃   │
 ┃┃・変数2  ・変数B ┃┃┃        ┃public↓
 ┃┗━━━━━━━━━┛┃┃ 利用     ┠─○メソッドA
 ┗━━━━━━━━━━━┛┗━━━━━━━━┛

図)publicなメソッドから、他のフィールドやメソッドを利用
変数.メソッドA()

 ┏メモリ━━━━━━━━┓┏クラス━━━━━┓
 ┃┏インスタンス━━━┓┃┃        ┃public
 ┃┃private  public ┃┃┃private     ┠─○メソッドB 
 ┃┃・変数1  ・変数A ┃┃┠─●メソッド  ┃    ↑
 ┃┃・変数2  ・変数B ┃┃┃    ↑   ┃    │
 ┃┗━━━━━━━━━┛┃┃ 利用 │   ┠─○メソッドA
 ┗━━↑━━━━↑━━━┛┗━━━━│━━━┛    │
    └────┴─────────┴────────┘

● メソッドの利用の実例

 以下、MyClassクラスを利用した、ソースコードの実例を示します。

ソースコード)メソッドとメソッドの利用の実例 src/sample/Sample.java
package sample;

public class Sample {
    public static void main(String[] args) {
        MyClass mc = new MyClass();    // オブジェクトを作成

        System.out.println(mc.label);  // 「名前」と出力
        System.out.println(mc.get());  // 「0」と出力

        mc.plus(3);   // 「3」を加算
        System.out.println(mc.get());  // 「3」と出力

        mc.minus(2);  // 「2」を減算
        System.out.println(mc.get());  // 「1」と出力
    }
}

出力)メソッドとメソッドの利用の実例
名前
0
3
1

ソースコード)src/sample/MyClass.java
package sample;

public class MyClass {
    // 公開フィールド(識別用名前)
    public String label = "名前";

    // 非公開フィールド(現在の値)
    private int inNo = 0;

    // 公開メソッド(数値を増加/減少/取得)
    public void plus(int no) {
        change(no);
    }

    public void minus(int no) {
        change(- no);
    }

    public int get() {
        return inNo;
    }

    // 非公開メソッド(数値を変更)
    private void change(int no) {
        inNo += no;
    }
}

この講座のマンガ部分は「箱人形マンガ(Box Comic) 」で作成しています。
作成:2013/05/29  更新:2015/08/09  [Permalink]