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

奥が深い 引数持ちメソッドの呼出し【Java Silver例題】

Java Silver 例題

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

今回は、引数を持ったメソッドの呼び出しについてです。

当たり前のことですが、引数付けてメソッドを呼び出すとその引数の型を持ったメソッドが呼び出されます。

一見なにも難しいことはありませんが、実は引数持ちメソッドの呼び出しにはマニアックなルールがあります。

Java Silverではこの嫌なところをたまについてくることがありますので、対策しておくにこしたことはありません。

 

問題:引数持ちメソッドの呼出しについて

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

問1

次のプログラムをコンパイル、実行したときの結果として正しいものを選びなさい。(1つ選択)

A.  「可変長引数」と表示される
B.   コンパイルも実行も成功するが何も表示されない
C.   コンパイルエラー

 

問2

次のプログラムをコンパイル、実行したときの結果として正しいものを選びなさい。(1つ選択)

A.  「可変長引数」と表示される
B.  「オートボクシング」と表示される
C.   コンパイルも実行も成功するが何も表示されない
D.   コンパイルエラー

 

問3

次のプログラムをコンパイル、実行したときの結果として正しいものを選びなさい。(1つ選択)

A.  「可変長引数」と表示される
B.  「オートボクシング」と表示される
C.   「暗黙キャスト」と表示される
D.   コンパイルも実行も成功するが何も表示されない
E.   コンパイルエラー

 

問4

次のプログラムをコンパイル、実行したときの結果として正しいものを選びなさい。(1つ選択)

A.  「暗黙キャスト」と表示される
B.  「キャスト暗黙」と表示される
C.   コンパイルも実行も成功するが何も表示されない
D.   コンパイルエラー

 

いかがでしょうか?

 

 

意外と難問だったのではないでしょうか。

答えは
問1 A
問2 B
問3 C
問4 D  です。

 

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

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

続きを見る

 

引数持ちメソッドのポイントと解説

引数持ちメソッドの呼出しについて4問出題しましたが、全部に共通するのは完全一致する引数を持つメソッドがないということです。

今回のように完全一致する引数のメソッドがない場合は、どれが呼び出されるかがわかりづらくなってしまいます。

しかし、実は次のポイントを知っていればシンプルに理解することができます。

 

引数持ちメソッドのポイント

● 引数持ちメソッドが複数ある場合、次の優先順位で呼び出される

完全一致暗黙キャストオートボクシング可変長引数

● 優先順位が同じメソッドが複数ある場合はコンパイルエラーになる

 

暗黙キャストの引数

暗黙キャストとは変数の型が自動的に別の型に変換されることです。

例えば、int型の変数が自動的にdouble型やlong型になるときです。

もし、次のように完全一致する引数のメソッドがない場合、暗黙キャストできる引数のメソッドが呼び出されます。

「3.0」と表示される

 

オートボクシングの引数

オートボクシングとはint、long、doubleといったプリミティブ型が、Integer、Long、Doubleなどのそれぞれのラッパークラスに自動変換されることです。

次のように完全一致する引数と暗黙キャストする引数がない場合は、オートボクシングする引数を持つメソッドが呼び出されます。

「3」と表示される

 

可変長引数

可変長引数は次のように表記される引数で、同じ型なら複数あっても該当するという役割があります。

void method (int... a);
void method(double a ,int... b);

 

可変長引数を持つメソッドの優先順位は一番低く完全一致・暗黙キャスト・オートボクシングする引数がない場合に呼び出されます。

「3」と表示される

 

同じ優先順位の引数を持つメソッドが複数ある場合

次のプログラムのように同じ優先順位の引数を持つメソッドが複数ある場合、コンピューターはどちらを呼び出すべきか判断できません。

したがって、呼び出し元でコンパイルエラーになります。

 

問題の解説

ここまでのポイントをおさえていれば、4問とも簡単に解くことができます。

 

問1

次のプログラムをコンパイル、実行したときの結果として正しいものを選びなさい。(1つ選択)

A.  「可変長引数」と表示される
B.   コンパイルも実行も成功するが何も表示されない
C.   コンパイルエラー

 

4行目でmethod()メソッドを呼び出していますが、可変長引数を持ったメソッドしかありません。

可変長引数は型が一致していれば呼出可能なので、method(String a, in... b)メソッドが呼び出され、8行目の処理実行により「可変長引数」と表示されます。

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

 

問2

次のプログラムをコンパイル、実行したときの結果として正しいものを選びなさい。(1つ選択)

A.  「可変長引数」と表示される
B.  「オートボクシング」と表示される
C.   コンパイルも実行も成功するが何も表示されない
D.   コンパイルエラー

 

このプログラムでは問1のコードにオートボクシングする引数を持つメソッドが加えられています。

どちらも呼出し可能な引数を持っていますが、可変長引数よりもオートボクシングする引数の方が優先順位は高いため10行目のメソッドが呼び出され、「オートボクシング」と表示されます。

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

 

問3

次のプログラムをコンパイル、実行したときの結果として正しいものを選びなさい。(1つ選択)

A.  「可変長引数」と表示される
B.  「オートボクシング」と表示される
C.   「暗黙キャスト」と表示される
D.   コンパイルも実行も成功するが何も表示されない
E.   コンパイルエラー

 

このプログラムは問2のコードに暗黙キャストする引数を持ったメソッドが加えられています。

3つのメソッドはすべて呼び出し可能ですが、このうち暗黙キャストする引数が最も優先順位が高いため13行目のメソッドが呼び出され、「暗黙キャスト」と表示されます。

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

問4

次のプログラムをコンパイル、実行したときの結果として正しいものを選びなさい。(1つ選択)

A.  「暗黙キャスト」と表示される
B.  「キャスト暗黙」と表示される
C.   コンパイルも実行も成功するが何も表示されない
D.   コンパイルエラー

 

このプログラムでは、4行目で2つのint型を持ったメソッドを呼び出しています。

methodメソッドは2つあり、どちらもint型とdouble型の引数を持ち、その順番が異なります。

このとき、両方とも暗黙キャストにより呼び出し可能ですが、優先順位が同じであるためどっちを呼び出すか判断できません。

したがって、コンパイルエラーとなるので答えはDです。

 

 

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

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

続きを見る

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

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