前回作成したMyClassを使い、オブジェクトを作成してみます。
ソースコードは、前回MyClassを作成した、Sampleプロジェクトの「src/sample/Sample.java」に書きます。
package sample; public class Sample { public static void main(String[] args) { MyClass mc = new MyClass(); } }
以下、オブジェクトの作成部分を抜粋します。
MyClass mc = new MyClass();
オブジェクト用の変数の作成は以下のように書きます。参照型の「型」は「クラス」になります。
クラス 変数 = new クラス();
この時、クラスの後には「( )」が付いています。これは、これまで出て来た命令と同じ「命令( )」という用法の「( )」です。
この括弧には、引数と呼ばれる値が設定されることがあります。
クラス(値) クラス(値, 値, …)
こういった括弧の使い方は、今後出てくるメソッドの話で、詳しく説明します。
Javaの「new」は、インスタンスを確保して、オブジェクトの参照を作成する演算子です。
このnewを利用すると、メモリ上に「インスタンス」と呼ばれる、フィールドの保存場所が新たに確保されて、オブジェクトが作成されます。
インスタンスは、newでオブジェクトを作成するごとに、新たにメモリ上に確保されます。
MyClass mc1 = new MyClass(); MyClass mc2 = new MyClass();
┏クラス━━━━━┓ ┏メモリ━━━━━━━━━┓ ┃ ┃ ┃ ┃ ┃private ┃public →→→┃┏ mc1用インスタンス━┓┃ ┠─●フィールド ┠─○フィールド →→→┃┃・変数1 ・変数A ┃┃ ┃ ・変数1 ┃ ・変数A →→→┃┃・変数2 ・変数B ┃┃ ┃ ・変数2 ┃ ・変数B ┃┗━━━━━━━━━━┛┃ ┃ ┃ →→→┃┏ mc2用インスタンス━┓┃ ┠─●メソッド ┠─○メソッド →→→┃┃・変数1 ・変数A ┃┃ ┃ ・メソッド1 ┃ ・メソッドA →→→┃┃・変数2 ・変数B ┃┃ ┃ ・メソッド2 ┃ ・メソッドB ┃┗━━━━━━━━━━┛┃ ┗━━━━━━━━┛ ┗━━━━━━━━━━━━┛
Javaのオブジェクトは、メモリ上に確保されたインスタンスと、クラスのメソッドで構成されています。
┏オブジェクト━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃┏メモリ━━━━━━━━┓┏クラス━━━━━┓ ┃ ┃┃┏インスタンス━━━┓┃┃ ┃ ┃ ┃┃┃private public ┃┃┃private ┃public ┃ ┃┃┃・変数1 ・変数A ┃┃┠─●メソッド ┠─○メソッド ┃ ┃┃┃・変数2 ・変数B ┃┃┃ ・メソッド1 ┃ ・メソッドA ┃ ┃┃┗━━━━━━━━━┛┃┃ ・メソッド2 ┃ ・メソッドB ┃ ┃┗━━━━━━━━━━━┛┗━━━━━━━━┛ ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
オブジェクトを格納した変数からは、外部に公開されているpublicなフィールドとメソッドが利用できます。
┏オブジェクト━━┓ ┃ ┃ ┃ ┃public ┃ ┠─○フィールド ┃ 隠蔽 ┃ ・変数A ┃ ┃ ・変数B ┃ ブラック ┃ ┃ ボックス ┠─○メソッド ┃ ┃ ・メソッドA ┃ ┃ ・メソッドB ┗━━━━━━━━┛
Javaのオブジェクトのフィールドは、「変数.フィールド名」で利用できます。こう書くことで、インスタンスの値や参照を読み書きできます。
変数.変数A─────────────┐publicな │変数を ┏メモリ━━━━━━━━┓ │参照 ┃┏インスタンス━━━┓┃ │ ┃┃private public ┃┃ │ ┃┃・変数1 ・変数A ←──┘ ┃┃・変数2 ・変数B ┃┃ ┃┗━━━━━━━━━┛┃ ┗━━━━━━━━━━━┛
Javaのオブジェクトのメソッドは、「変数.メソッド名()」で利用できます。
呼び出されたpublicなメソッドは、オブジェクト内の他のメソッドやフィールドを自由に利用できます。このメソッドやフィールドは、publicでもprivateでも構いません。
この時、利用できるフィールドは、各オブジェクト毎に確保された、インスタンス内のフィールドのみになります。他のオブジェクトのフィールドにはアクセスできません。そのため各オブジェクトは、内部で完結した、ひとまとまりの物として扱えます。
変数.メソッドA()───────────────────┐publicな │メソッドを ┏メモリ━━━━━━━━┓┏クラス━━━━━┓ │参照 ┃┏インスタンス━━━┓┃┃ ┃ │ ┃┃private public ┃┃┃private ┃ │ ┃┃・変数1 ・変数A ┃┃┠─●メソッド ┃ │ ┃┃・変数2 ・変数B ┃┃┃ ┃public↓ ┃┗━━━━━━━━━┛┃┃ 利用 ┠─○メソッドA ┗━━━━━━━━━━━┛┗━━━━━━━━┛
変数.メソッドA() ┏メモリ━━━━━━━━┓┏クラス━━━━━┓ ┃┏インスタンス━━━┓┃┃ ┃public ┃┃private public ┃┃┃private ┠─○メソッドB ┃┃・変数1 ・変数A ┃┃┠─●メソッド ┃ ↑ ┃┃・変数2 ・変数B ┃┃┃ ↑ ┃ │ ┃┗━━━━━━━━━┛┃┃ 利用 │ ┠─○メソッドA ┗━━↑━━━━↑━━━┛┗━━━━│━━━┛ │ └────┴─────────┴────────┘
以下、MyClassクラスを利用した、ソースコードの実例を示します。
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
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; } }