java練習問題
java練習問題
動作環境と問題内容について
javaの練習問題です。 出題範囲はjava 8 で追加された範囲を中心とします。難易度は Java SE 8 Programmer I の試験と同程度※を想定しています。
※ただし、場合によっては同試験には出題されない内容や形式が含まれることもあります。あくまでも難易度の目安として解答してください。
実行環境は以下の通りです。
PC:MacBook Pro 2011early 15inch
OS:Windows 8.1(デュアルブート) 64bit版
メモリ:16GB(8GB x 2)
CPU:Core i7-2635QM 2.00GHz
javaのバージョン:java 8 Update102
※問題文に書いてあるプログラムを実行する際は自己責任で実行してください。
問題
次のプログラムを作成した。コンパイル、実行に関して以下の問いに答えなさい。
プログラム(Sample.java)
public class Sample{ public static void main(String[] args){ MyInterface obj = /*[A]*/ } } interface MyInterface{ public abstract void myMethod(Object val); }
問./[A]/の部分に入れてコンパイルしてもコンパイルエラーにならないものを以下の選択肢からすべて選びなさい。
選択肢
/* a */ (Object val) -> { System.out.println("Hello"); }; /* b */ (Object val) -> System.out.println("Hello"); /* c */ Object val -> { System.out.println("Hello"); }; /* d */ Object val -> System.out.println("Hello"); /* e */ (val) -> { System.out.println("Hello"); }; /* f */ (val) -> System.out.println("Hello"); /* g */ val -> { System.out.println("Hello"); }; /* h */ val -> System.out.println("Hello"); /* i */ val -> { return; }; /* j */ (val) -> return; /* k */ (Object t) -> { System.out.println("Hello"); }; /* l */ () -> { System.out.println("Hello"); };
解答
a,b,e,f,g,h,i,k
解説
今回はすべての選択肢がラムダ式による実装形式になっている。
実装のもととなっているインタフェースは次のように定義されている。
interface MyInterface{ public abstract void myMethod(Object val); }
このインタフェースには抽象メソッドとしてmyMethod()メソッドが定義されている。
このインタフェースをラムダ式を使って実装行う場合は次のように行う。
(抽象メソッドの引数の型名 引数名) -> { //抽象メソッドの処理 };
今回の場合、この通りに実装すると以下のようになる。
MyInterface obj = (Object val) -> { //処理内容 };
この表記は省略表記が可能な場合があり、各選択肢は何らかの省略表記が行われている。
その中で、適切な省略が行われている選択肢を選択することになる。
a
(Object val) -> { System.out.println("Hello"); };
選択肢 a は省略が全く行われていない。そのため問題はない。
b
(Object val) -> System.out.println("Hello");
選択肢 b は、矢印の後の{ }が省略されている。{ }の処理が1行しかない場合、{ }は省略可能である。そのため、問題はない。
c
Object val -> { System.out.println("Hello"); };
選択肢 c は選択肢 a と比べると、引数の部分の( )が省略されている。ラムダ式では引数の( )の省略も可能だが、条件※がある。
この選択肢はその条件を満たしていないため、コンパイルエラー。※詳しくは選択肢 g の解説参照。
d
Object val -> System.out.println("Hello");
選択肢 d は選択肢 b と比べて引数の( )の省略が行われている。
選択肢 d も省略の条件を満たしていないため、コンパイルエラー。
e
(val) -> { System.out.println("Hello"); };
選択肢 e は選択肢 a と比べて、引数のデータ型が省略されている。ラムダ式を使用する場合、引数のデータ型が推測できる場合は引数のデータ型をすべて省略することは可能である。そのため問題はない。
ただし、2つ以上引数がある場合、データ型を省略した引数と省略しない引数を混在させることはできないので注意すること。
f
(val) -> System.out.println("Hello");
選択肢 f は選択肢 e と比べて{ }の省略が行われている。これは、選択肢 b で解説した通りで、処理が1行ならば問題はない。
g
val -> { System.out.println("Hello"); };
選択肢 g は、選択肢 e と比べて、引数の()が省略されている。引数の()を省略する場合は、すべての引数でデータ型の省略が行われていなければならない。
同じく()を省略した選択肢 c は引数のデータ型が省略されていなかったためコンパイルエラーになったが、選択肢 g はデータ型まで省略されているため問題ない。
h
val -> System.out.println("Hello");
選択肢 g は、選択肢 e と比べてさらに{ }も省略されているが、選択肢 b で解説した通り、処理が1行ならば問題はない。
i
val -> { return; };
選択肢 i は選択肢 h と比べて処理内容がreturn文のみとなっている。それ以外は選択肢 h と同じになっている。処理内容がreturn文のみの場合でも特に問題はない。
j
(val) -> return;
選択肢 j は選択肢 i と比べて{ }が省略されている。一見すると問題なさそうだが、{ }が省略される場合は、returnのキーワードは必ず省略される。よって、コンパイルエラー。
k
(Object t) -> { System.out.println("Hello"); };
選択肢 k は、選択肢 a と比べて引数名が異なっている。しかし、引数名はインタフェースの引数名と異なっていても、それだけでコンパイルエラーになることはない。そのため問題はない。
l
() -> { System.out.println("Hello"); };
選択肢 l は、引数そのものの記述が省略されている。基のインタフェースと比べて、引数そのものを省略することはできない。そのため、コンパイルエラー。
ラムダ式を使用する際は以上に挙げた注意点に注意して使用すること。
ラムダ式の省略については以下の表も参照すること。
ラムダ式の省略可否一覧
省略個所 | 省略の可否 | 注意点 |
---|---|---|
引数のデータ型 | ○ 省略可能 | ・データ型が省略されている引数とされていない引数が混ざっている場合は省略できない。
※省略する場合は必ずすべての引数のデータ型を省略すること。 |
引数の( ) | △ 省略可能 ※ 条件付き |
・引数なしの場合は省略できない。
・引数が2つ以上の場合は省略できない。 ・ 引数のデータ型が書いてあると( )は省略できない。
※引数が1つで、データ型が省略されている時のみ省略可能。 |
処理の{ } | △ 省略可能 ※ 条件付き |
・処理が2行以上にわたる場合は省略できない。
・処理が ; しかない場合は省略できない。(プログラムの構造がおかしくなるため) ・戻り値がある場合、return キーワードが書いてあると省略できない。
※処理が1行しかない場合は省略可能。戻り値がある場合は下記参照。 |
(戻り値がある場合) return キーワード |
△ 省略可能 ※ 条件付き |
・return 文以外の処理もある場合は省略できない。
・{ } が書いてあると省略できない。
※ 処理内容がreturn 文のみで、{ }も省略する場合のみ省略可能。その場合、処理内容には戻り値のみが書かれる。 ※ 戻り値そのものがなくなるわけではないので注意。 |
引数名 | × 省略できない | ・引数名は省略できない。
※ただし、引数名はもとのインタフェースと異なっていても良い。ローカル変数のスコープに注意して変数名を定義すること。 |
オススメ!!→ java 8 の問題はこちら