IT転職・プログラミングスクール

正しいオーバーロードはどれ?【Java Silver例題】

Java Silver 例題

この記事は、Oracle Java SE8 Silver(1Z0-808)の対策講座です。

今回はオーバーロードについてです。

オーバーロードは同じ名前のメソッドを引数のパターンを変えて複数作ることです。

Java Silverでは正しいオーバーロードを選択させる問題が必ずと言っていいほど出題されるので、しっかりと対策しておく必要があります。

 

問題:オーバーロードについて

早速ですが、次の2問を解いてみてください。

問1

次のメソッドをオーバーロードするメソッド定義として、正しいものを選びなさい。(1つ選択)

A.   int test(int a) { }
B.   private int test(int a) { }
C.   public int test(int a) { }
D.   void test(int a) { }
E.   すべて誤りである

 

問2

次のメソッドをオーバーロードするメソッド定義として、正しくないものを選びなさい。(1つ選択)

A.   int method() { }
B.   int method(int b, String var) { }
C.   int method(String var, int a) { }
D.   int method(double a) { }
E.   int method(int a, String... str) { }
F.   すべて誤りである

 

いかがでしょうか?

 

 

答えは

問1 E
問2 B   です。

 

Java Silver 問題集
参考記事【Java Silver問題集】高頻出・間違えやすい問題たち

この記事は、Oracle Java SE8 Silver(1Z0-808)の対策講座です。 出題確率が高く、間違いやすい例題が解説付きで100問以上あります。   Java Silver 問 ...

続きを見る

 

オーバーロードのポイントと解説

正しくオーバーロードをするには次のポイントを理解しておく必要があります。

オーバーロードのポイント

● シグニチャが異なる

● アクセス修飾子は同じでないといけない

● 戻り値の型は同じでないといけない


ポイントを1つずつ解説していきます。

 

シグニチャを変えないといけない

シグニチャとは次の3つのことでです。

・引数の数
・引数の型
・引数の順番

オーバーロードするにはこの3つのうち少なくともどれか1つを変える必要があります。

 

例えば、次のメソッドをオーバーロードするには以下のような方法があります。

void Sample(String s, int a) { }

//引数の数が違うのでOK
void Sample(String s) { }

//引数の型が違うのでOK
void Sample(double s, int s) { }

//引数の順番が違うのでOK
void Sample(int a, String s) { }

 

ややこしいのが可変長変数に変わったときです。

実は可変長変数になっても、変数の数が違うと判定されるため次のような例ではオーバーロードは成立します。

//可変長変数でもOK
void Sample(String s, int... a) { }

 

注意したいのが、変数に使っている文字だけを変えた場合です。

変数の文字はシグニチャに含まないので、オーバーロードは成立しません。

//変数の文字だけ違うとコンパイルエラー
void Sample(String x, int y) { }

 

アクセス修飾子と戻り値の型は変えちゃいけない

オーバーロードが成立するのはシグニチャのみを変えたときだけです。

つまり、シグニチャ以外のアクセス修飾子や戻り値の型を変えるとコンパイルエラーになります。

 

次のメソッドのシグニチャ以外を変えた例では、全部コンパイルエラーになってしまいます。

private int Sample(int a) { }

以下全部コンパイルエラー

int Sample(String s) { }
public Sample(int a, double b) { }
private void Sample(char c) { }

 

解説

ここまでのポイントさえ知っていれば、今回の2問はあっさり解くことができます。

 

問1

次のメソッドをオーバーロードするメソッド定義として、正しいものを選びなさい。(1つ選択)

A.   int test(int a) { }
B.   private int test(int a) { }
C.   public int test(int a) { }
D.   void test(int a) { }
E.   すべて誤りである

 

Aはアクセス修飾子がprotectedからデフォルトに変えているので誤りです。アクセス修飾子が同じだとしてもシグニチャを変えていないのでコンパイルエラーになります。

BとCも同じくアクセス修飾子が変わっているので誤りです。

Dはアクセス修飾子はデフォルトのままで同じですが、戻り値の型がintからvoidに変わっているので誤りです。

したがって、すべて誤りなので答えはEです。

 

問2

次のメソッドをオーバーロードするメソッド定義として、正しくないものを選びなさい。(1つ選択)

A.   int method() { }
B.   int method(int b, String var) { }
C.   int method(String var, int a) { }
D.   int method(double a) { }
E.   int method(int a, String... str) { }
F.   すべて誤りである

 

Aは引数がなくなっていますが、引数の数が0に変わったと判定されるのでオーバーロードは成立します。

Bは変数の文字だけを変えています。
変数の文字はシグニチャに含まれず、オーバーロードは成立しないので誤りです。

Cは引数の順番が変わっているので正しいです。

Dは引数の数と引数の型も変わっているので正しいです。

EはString型が可変長変数に変わっていますが、引数の数が異なると判定されるためオーバーロードは成立します。

したがって、答えはBです。

 

 

Java Silver 問題集
参考記事【Java Silver問題集】高頻出・間違えやすい問題たち

この記事は、Oracle Java SE8 Silver(1Z0-808)の対策講座です。 出題確率が高く、間違いやすい例題が解説付きで100問以上あります。   Java Silver 問 ...

続きを見る

-IT転職・プログラミングスクール
-,

Copyright© 人生2段飛ばし , 2020 All Rights Reserved Powered by AFFINGER5.