本節ではオーバーロードについての話題ですが、内容はそれほど重要ではありません。先の節で解説した多態性はとても重要な概念で、本節の内容はそれと似て非なる紛らわしい内容のため、混乱を感じたら読むのを止めてしまって下さい。余裕ができてから読めば大丈夫です。
なお、普段、本節の内容を意識することはあまりないと思います。
多態性とは、「参照型変数自身の型ではなく、参照先変数が参照しているインスタンスの型に対応したメソッドが実行される」というものでした。ここでは、それとは別に、参照型変数があるメソッドに引数として渡される場合の話をしたいと思います。つまり、呼び出すのではなく、呼び出されるときの話ということになります。
それはオーバーロードの話になるのですが、端的に言えば、「参照先変数が参照しているインスタンスの型に関係なく、参照型変数自身の型に応じたメソッドが実行される」ということになります。多態性のときとは逆の処理になります。さっそく、実験してみましょう。
ソースコードは以下の通り。
M701/M701.java
import java.awt.Point; /** * 継承とオーバーロードの関係を確認します。 */ public class M701 { /** * メインメソッド。 * @param args 引数 */ public static void main(String[] args) { // Point型インスタンスを生成 Point point = new Point(10, 20); Object object = point; // インスタンスメソッドを実行 System.out.println("変数 pointの参照先インスタンスは " + point); System.out.println("変数 objectの参照先インスタンスは " + object); // オーバーロードを確認 M701.print(point); M701.print(object); } /** * 出力します。 * @param point ポイント */ private static void print(Point point) { System.out.println("print(Point point)メソッドが呼び出されました。"); } /** * 出力します。 * @param object オブジェクト */ private static void print(Object object) { System.out.println("print(Object object)メソッドが呼び出されました。"); } }
実行結果は以下の通り。
変数 pointの参照先インスタンスは java.awt.Point[x=10,y=20] 変数 objectの参照先インスタンスは java.awt.Point[x=10,y=20] print(Point point)メソッドが呼び出されました。 print(Object object)メソッドが呼び出されました。
メインメソッドでは Point型インスタンスを 1個生成しています(Object型インスタンスはひとつも生成しません)。
19行目では多態性が表れています。参照型変数の型に関わらず、Point型の toStringメソッドが呼び出されていることが分かります。
一方で、23行目では、インスタンスの実際の型には関係なく参照型変数の型に応じて、Objectを引数にとる printメソッドが呼び出されていることが分かります。
この節では、参照型とオーバーロードの関係について軽く説明しました。
本当は細かいルールが幾つかあるのですが、説明すると長い話になりますので止めにします。