どうもJavaを学習していると色々なサイトで「インスタンス」と「オブジェクト」が混同して使用されている為、私も含めオブジェクト指向の初心者の方には混乱する一因にもなっています。一度、自分の頭の中の整理も含めておさらいしてみようと思います。
基本的にオブジェクト指向では、すべてのモノや事柄を「オブジェクト」として捉えています。この時点ではクラスという概念がなくても、オブジェクトは存在します。一方、インスタンスとはクラスという概念を具象化したものです。Java言語においては、すべてのオブジェクトはクラスから作られますので、すべてのオブジェクト=インスタンスとなります。このことから開発現場では「インスタンス」と「オブジェクト」を使い分けずに使用することが多い為、初心者の方が混乱する一因になっているようですね。
- ここで少し身近な具体例として「パソコン構成」をクラスに置き換えて考えてみましょう。
- パソコンの構成がイメージ出来たでしょうか?
このままではただの設計図でしかないので、次にパソコンを生成するクラスを作成してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
/** * パソコン構成を表示するクラス */ public class Pc { /** * マザーボード */ private String motherBoard; /** * CPU */ private String cpu; /** * グラフィックボード */ private String graphicBoard; /** * メモリ */ private String memory; /** * パソコン・クラスのコンストラクタ */ public Pc() { // マザーボードに「ASUS F2A85-V PRO」をセット motherBoard = "ASUS F2A85-V PRO"; // CPUに「Intel Core i7 Extreme Processor i7-3970X」をセット cpu = "Intel Core i7 Extreme Processor i7-3970X"; // グラフィックボードに「NVIDIA GeForce GTX 690」をセット graphicBoard = "NVIDIA GeForce GTX 690"; // メモリに「Kingston ValueRAM 12GBKit (3x4GB)-DDR3 1066MHz」をセット memory = "Kingston ValueRAM 12GB Kit(3x4GB)-DDR3 1066MHz"; } /** * パソコン構成を表示 */ public void showPc() { System.out.println("パソコン構成を表示"); System.out.println(" マザーボード : " + getMotherBoard()); System.out.println(" CPU : " + getCpu()); System.out.println(" グラフィックボード : " + getGraphicBoard()); System.out.println(" メモリ : " + getMemory()); } /** * パソコンのマザーボードを取得 * * @return マザーボード */ public String getMotherBoard() { return motherBoard; } /** * パソコンのCPUを取得 * * @return CPU */ public String getCpu() { return cpu; } /** * パソコンのグラフィックボードを取得 * * @return グラフィックボード */ public String getGraphicBoard() { return graphicBoard; } /** * パソコンのメモリを取得 * * @return メモリ */ public String getMemory() { return memory; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
/** * パソコン製造業者クラス */ public class PcManufacture { /** * パソコンの受注依頼を受けるクラス * * @return パソコン・インスタンス */ public Pc acceptPcOrder() { // パソコン・クラスからパソコン・クラスのインスタンスを生成 final Pc pcIns = new Pc(); // 生成されたパソコン・インスタンスをreturnします return pcIns; } } |
- 12行目でパソコン・クラスのインスタンスを生成しています。この作業を「パソコン・オブジェクトの生成」とか「パソコン・クラスのインスタンス化」という表現をしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
/** * パソコンを購入するお客様クラス */ public class Customer { public static void main(final String[] args) { // パソコン製造業者を生成する final PcManufacture pcManIns = new PcManufacture(); // パソコン製造業者にパソコンを注文する final Pc pcIns = pcManIns.acceptPcOrder(); // 注文されたパソコンを表示する pcIns.showPc(); } } |
- パソコン製造業者がいないと、お客様が注文する相手がいませんので、7行目でパソコン製造業者・クラスのインスタンスを生成しています。
- 10行目でパソコン製造業者のacceptPcOrderメソッドを呼び出す事により、パソコン・クラスのインスタンスを生成し、お客様クラスで使用出来るようにしています。
項目 | サンプルソースの例だと | 備考 |
---|---|---|
クラス | Pc、PcManufacture、Customer | 設計図 |
オブジェクト | クラスオブジェクト:Pc、PcManufacture、Customer インスタンスオブジェクト:pcIns、pcManIns | 設計工程で用いる俗語のようなもの。製造工程ではインスタンスと同義語と思ってもさほど差し支えない。 |
インスタンス | pcIns、pcManIns | クラスを具象化した実体 |
どうでしょうか?
この解説である程度ご理解が進めば幸いです。それにしても日本語って難しいですね・・・。
オブジェクトが俗語ですか…。
Smalltalkでは、メッセージを受け取ることが出来るものを指してオブジェクトとといいます。インスタンスもクラスも変数に突っ込んでしまえばメッセージを送る側からすれば区別がつきません。故に基本的にインスタンスにメッセージを送るなどと言わずオブジェクトにメッセージを送ると言います。
| object |
“クラスオブジェクトにメッセージを送る。
object := Example.
object doSomething.
“インスタンスオブジェクトにメッセージを送る”
object := Example new.
object doSomething.
インスタンスという言葉の使い方ですが同じクラスのインスタンスとクラスを明確に区別したい時に使ってます。Exampleクラスのオブジェクトでは、クラスオブジェクトを指してるのかインスタンスオブジェクトを指してるのか分かりませんから。