連載
» 2008年06月17日 00時00分 公開

オーバーロードを習得するソースコードで学ぶ SJC-P 5.0 ドリル(10)(2/2 ページ)

[山本道子,有限会社 Ray]
前のページへ 1|2       

解答

 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. }
サンプルコード2(Sample2.java)
C:\sample>java Sample2
Super
Sub
C:\sample>
サンプルコード2の実行結果

 サンプルコード2のように、7行目でサブクラスをインスタンス化していても、そのオブジェクトを扱っている変数の型がスーパークラスであるため、スーパークラスの型を引数に指定した12行目が呼び出されます。これに対し、9行目では変数の型がサブクラスであるため、15行目のメソッドが呼び出されます。

 本連載は、今回で最後となります。ご愛読いただきありがとうございました。

筆者紹介

山本道子

有限会社Ray代表。千葉県出身。一般事務、派遣を経て2000年サン・マイクロシステムズ入社。J2SEのほか、J2EEなどサーバサイドJavaコース担当およびテキスト開発に携わる。2004年退職後、有限会社Rayを設立し、システム開発、インストラクタ、執筆などを手掛けている。


前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。