);}}この3クラスはすべてPolySuperクラスのサブクラスで、printMyName()メソッドをオーバーライドしています。これはこれまで見てきたサブクラスと同じですね。今回の例は、スーパークラスとサブクラスの関係という点ではこれまでとほぼ同じです。違うのは、スーパークラスにgetInstance()メソッドがあることと、サブクラスが3つもあるという点くらいです。それよりも、使う側、インスタンスを作る箇所がこれまでと大きく異なります。インスタンスを取得します。printMyName()メソッドを呼び出します。インスタンスを取得します。printMyName()メソッドを呼び出します。インスタンスを取得します。printMyName()メソッドを呼び出します。インスタンスを取得します。printMyName()メソッドを呼び出します。PolySub3これまではnewを使ってインスタンスを作っていましたが、今回はPolySuperクラスのgetInstance()メソッドを呼び出しています。参照を受け取っている箇所は同じですから、このgetInstance()メソッドがインスタンスを作成しているということです(getInstance()メソッドはstaticメソッドですからインスタンスを作らなくても呼び出せます)。そのgetInstance()メソッドでは何をしているのか、もう一度ちゃんと見てみましょう。サブクラスのインスタンスを作って、その参照を返します。渡された番号によって作るインスタンスを変えます。サブクラスのインスタンスを作って、その参照を返します。渡された番号によって作るインスタンスを変えます。null;}}getInstance()メソッドは、引数で渡された番号によって作るインスタンスを変えます。1が渡されたらPolySub1。2が渡されたらPolySub2。3が渡されたらPolySub3。渡された番号によって作るインスタンスを変えて、作ったインスタンスへの参照を返します。getInstance()メソッドの戻り値の型はPolySuperクラス、つまりPolySub1・PolySub2・PolySub3のスーパークラスです。サブクラスの参照はスーパークラスの参照型へとアップキャストされるので、そのまま返すことができます。最初に、getInstance()メソッドに1を渡しています。するとPolySub1クラスのインスタンスが作られ、その参照が返されます。インスタンスを取得します。printMyName()メソッドを呼び出します。インスタンスを取得します。printMyName()メソッドを呼び出します。PolySub1refSuper変数には今作られた「PolySub1クラスのインスタンス」への参照が入れられます。getInstance()メソッドに1を渡した場合そのため、printMyName()メソッドを呼び出すと「PolySub1クラスのprintMyName()メソッド」が呼び出されます。refSuper変数はPolySuperクラスの参照型ですが、参照先のインスタンスはPolySub1クラスで、その中でprintMyName()メソッドをオーバーライドしているのでそのメソッドが呼び出されるわけです。今度は、getInstance()メソッドに3を渡します。するとPolySub3クラスのインスタンスが作られ、その参照が返されます。インスタンスを取得します。printMyName()メソッドを呼び出します。インスタンスを取得します。printMyName()メソッドを呼び出します。PolySub3refSuper変数には今作られた「PolySub3クラスのインスタンス」への参照が入れられます。getInstance()メソッドに3を渡した場合そのため、printMyName()メソッドを呼び出すと「PolySub3クラスのprintMyName()メソッド」が呼び出されます。今度の参照先インスタンスはPolySub3クラスなので、そのprintMyName()メソッドが呼び出されるわけです。このようなことが、これまで説明してきた「オーバーライド」と「アップキャスト」で行われるわけです。ここで参照を取得してprintMyName()メソッドを呼び出している箇所を並べてみましょう。PolySub3ここで注目して欲しいのは、printMyName()メソッドを呼び出している箇所です。どちらも「refSuper.printMyName();」としています。呼び出し方はまったく一緒です。出力結果が異なります。これは、実際に呼び出されているメソッドが、上はPolySub1クラスのprintMyName()メソッドで、下はPolySub3クラスのprintMyName()メソッドだからです。ポリモーフィズム!この「呼び出しているメソッドが一見同じなのに処理結果が変わる」という機能を「ポリモーフィズム」と言います。同じことをしているのに、参照先のインスタンスによって実際に呼び出されるメソッドが変わり、結果も変わる......この不思議な機能は「ポリモーフィズム」と呼ばれ、オブジェクト指向プログラミングでもとても重要な機能です。なんか滅茶苦茶な機能のように見えますが、でも基本的な原理は「オーバーライド」と「アップキャスト」の組み合わせ、ということはしっかり憶えておいてください。この2つの組み合わせでポリモーフィズムは実現するわけです。オブジェクト指向とJavaこのページは、Java言語を用いたオブジェクト指向プログラミングのチュートリアル解説を行う「Javaのオブジェクト指向入門」の一ページです。詳しい説明は「Javaのオブジェクト指向入門」目次をご覧ください。