解答
C
解説
Testクラスで定義された3つのメソッドはメソッド名が同じであるためオーバーロードされています。オーバーロードは、引数の並び、型、数が異なっていることが条件です。
3行目のメソッドは引数が2行目と同じであるためコンパイルエラーとなります。戻り値だけ異なるメソッドは、オーバーロードと見なされません。
【問題】 次のプログラムをコンパイルし、実行するとどうなりますか? 1つ選択してください。 1. public class Test { 2. public void method() {} 3. public int method() { return 0;} 4. public double method(int a){ return 0.0; } 5. } A.実行時エラー B.2行目にエラーがあるためコンパイルエラー C.3行目にエラーがあるためコンパイルエラー D.4行目にエラーがあるためコンパイルエラー E.コンパイルは成功し、 ほかのクラスからこれらのメソッドは問題なく呼び出しができる
継承関係にあるクラスをメソッドの引数に指定して、オーバーロードを利用することも可能です。しかし、オーバーロードは、コンパイル時にどのメソッドが呼び出されるか決定されるため、使用時には注意が必要です。
1. class Super { } 2. class Sub extends Super { } 3. 4. public class Sample2 { 5. public static void main(String[] args) { 6. Sample2 sample = new Sample2(); 7. Super obj1 = new Sub(); 8. sample.method(obj1); // 12行目が呼び出される 9. Sub obj2 = new Sub(); 10. sample.method(obj2); // 15行目が呼び出される 11. } 12. void method(Super obj) { 13. System.out.println("Super"); 14. } 15. void method(Sub obj) { 16. System.out.println("Sub"); 17. } 18. }
C:\sample>java Sample2 Super Sub C:\sample>
サンプルコード2のように、7行目でサブクラスをインスタンス化していても、そのオブジェクトを扱っている変数の型がスーパークラスであるため、スーパークラスの型を引数に指定した12行目が呼び出されます。これに対し、9行目では変数の型がサブクラスであるため、15行目のメソッドが呼び出されます。
本連載は、今回で最後となります。ご愛読いただきありがとうございました。
山本道子
有限会社Ray代表。千葉県出身。一般事務、派遣を経て2000年サン・マイクロシステムズ入社。J2SEのほか、J2EEなどサーバサイドJavaコース担当およびテキスト開発に携わる。2004年退職後、有限会社Rayを設立し、システム開発、インストラクタ、執筆などを手掛けている。
Copyright © ITmedia, Inc. All Rights Reserved.