難易度は Level 1(やさしめ)〜Level 5(難関) の5段階です。
Java Silver SE 17 (1Z0-825-JPN)のサンプル問題(本番形式・解説付き)
Java Silver SE 17 (1Z0-825-JPN)(Oracle・Java SE 17 Programmer I(Java Silver SE17))の出題形式を、実際の問題で確かめられます。ここに掲載する5問は、無料の会員登録で解ける模試 第1回(60問)の冒頭から抜粋したオリジナル問題です。当サイトは全420問を本番CBT準拠の形式で収録しており、この5問はそのごく一部にあたります。
設問1
次のコード
1: public class Greeter {
2: public static void main(String[] args) {
3: char[] label = {'J', 'a', 'v', 'a'};
4: System.out.print(label);
5: System.out.println("!");
6: }
7: }このプログラムを実行したときの出力はどれか。
- [C@ で始まる16進の値に続けて ! が出力される
- J! と1行だけ出力される
- Java! と1行だけ出力される(正解)
- 行4 で char 配列を print に渡せずコンパイルエラーになる
解説
行4 の print は PrintStream が持つ print(char[]) が選ばれ、配列の要素を文字として順に並べて出力する。だから label は Java として出力され、行5 の ! が同じ行に続いて改行される。対になるのは文字列連結の場合で、"" + label のように連結すると Object の文字列表現である [C@ 形式になる。渡し方の違いでどのオーバーロードが選ばれるかが分かれ目。
他の選択肢が誤りである理由
- 「[C@ で始まる16進の値に続けて ! が出力される」配列を文字列連結した場合や println(Object) が選ばれた場合の形。行4 は char 配列を直接渡しているため専用のオーバーロードが選ばれる。
- 「J! と1行だけ出力される」先頭要素だけが渡されるのは print(char) を呼んだ場合で、行3 の label は要素1つではなく配列そのもの。
- 「行4 で char 配列を print に渡せずコンパイルエラーになる」PrintStream には print(char[]) と println(char[]) が用意されているので、行4 の呼び出しは解決できる。
設問2
次のコード
1: public class Counter {
2: public void main(String[] args) {
3: System.out.println("counting");
4: }
5: }このソースファイルをコンパイルし、Counter クラスを起動したときの結果はどれか。
- コンパイルは成功し、counting が出力される
- 行2 に static が無いため、コンパイルの時点でエラーになる
- コンパイルは成功し、起動時に main が見つからない旨のエラーになる
- コンパイルは成功し、起動時に main が static でない旨のエラーが表示される(正解)
解説
行2 は public・戻り値 void・引数 String[] を備えており、メソッド宣言としては完全に正しいのでコンパイルは通る。起動時の判定は別で、名前と引数が一致する main は見つかるものの static ではないため、起動処理がそこで拒否される。混同しやすい対は『コンパイルエラー』と『コンパイルは通るが起動できない』で、static の欠落は後者に落ちる。
他の選択肢が誤りである理由
- 「コンパイルは成功し、counting が出力される」行2 はインスタンス・メソッドで、インスタンスを作らずに呼び出す起動処理の対象にならない。
- 「行2 に static が無いため、コンパイルの時点でエラーになる」static を付けるかどうかはメソッド宣言の妥当性に影響せず、行2 は文法として問題がない。
- 「コンパイルは成功し、起動時に main が見つからない旨のエラーになる」main という名前と String[] の引数は備えているため探索自体は当たっており、拒否される理由は static の欠落にある。
設問3
次のコード
1: public class Router {
2: public static void main(String[] args) {
3: System.out.println("array");
4: main(3);
5: }
6:
7: public static void main(int level) {
8: System.out.println("int " + level);
9: }
10: }Router クラスを起動したときの出力はどれか。
- array が出力され、続いて int 3 が出力される(正解)
- int 3 だけが出力される
- array だけが出力される
- 同じ名前のメソッドが2つあるため、起動する対象が決まらずエラーになる
解説
起動対象になれるのは引数が String[] の行2 だけで、行7 は名前が main でも起動の候補にならない。行2 が動いて array を出力し、行4 が行7 を通常のメソッド呼び出しとして起こすため int 3 が続く。起動対象の選定は引数の型で一意に決まる点が、通常のオーバーロード解決と分けて覚えるところ。
他の選択肢が誤りである理由
- 「int 3 だけが出力される」起動時に選ばれるのは行2 の String[] を取る方で、行7 は行4 の呼び出しによって初めて動く。
- 「array だけが出力される」行4 は行7 を呼び出す普通のメソッド呼び出しなので、行3 の出力だけでは終わらない。
- 「同じ名前のメソッドが2つあるため、起動する対象が決まらずエラーになる」引数の型が違えばオーバーロードとして共存でき、起動対象は String[] を取る方に定まる。
設問4
次のコード
1: public class Sundial {
2: public static void main(String[] args) {
3: System.out.println("array form");
4: }
5:
6: public static void main(String... args) {
7: System.out.println("varargs form");
8: }
9: }このソースファイルをコンパイルしたときの結果はどれか。
- コンパイルは成功し、起動すると array form が出力される
- 行6 で、String... と String[] の main を両方は宣言できないというエラーになる(正解)
- コンパイルは成功するが、起動時にどちらの main を使うか決められない旨のエラーになる
- コンパイルは成功し、起動すると varargs form が出力される
解説
可変長引数の String... args は、引数の並びとしては String[] args と同じものになる。つまり行2 と行6 は名前も引数の並びも同じメソッドで、別々のメソッドとして共存できず、行6 の宣言でコンパイルエラーになる。起動対象の main は String[] でも String... でもどちらか一方であればよいが、『どちらでもよい』ことと『両方書ける』ことは別で、同時に置くと重複になる。
他の選択肢が誤りである理由
- 「コンパイルは成功し、起動すると array form が出力される」行6 の宣言でコンパイルが止まるので、起動して行3 が動く場面には進まない。行6 のメソッドを消せばこの出力になる。
- 「コンパイルは成功するが、起動時にどちらの main を使うか決められない旨のエラーになる」起動対象の候補が2つ並ぶより手前、宣言の重複としてコンパイル時に弾かれる。java コマンドが選択に迷う場面は生じない。
- 「コンパイルは成功し、起動すると varargs form が出力される」行6 は行2 と同じ引数の並びとみなされるため、別のメソッドとして共存できない。
設問5
次のコード
1: public class Beacon {
2: public static void main(String... signals) {
3: System.out.println("beacon on");
4: }
5: }Beacon クラスを起動したときの結果はどれか。
- 起動時に main が見つからない旨のエラーになる
- 引数名が args でないためコンパイルエラーになる
- beacon on と出力されて正常に終了する(正解)
- 起動時に signals が null になり、例外が発生して終了する
解説
可変長引数 String... は内部的に String[] と同じ引数の形になるため、行2 は起動対象として認められる。引数の名前は宣言する側の自由で、args でなくても判定には関わらない。引数を渡さずに起動した場合も長さ 0 の配列が渡されるので、null になる形とは区別して覚える。
他の選択肢が誤りである理由
- 「起動時に main が見つからない旨のエラーになる」String... は String[] と同じ引数の形として扱われるため、起動対象の条件を満たしている。
- 「引数名が args でないためコンパイルエラーになる」引数の名前は任意で、型と並びが String[] に相当していればよい。
- 「起動時に signals が null になり、例外が発生して終了する」引数を渡さずに起動しても長さ 0 の配列が渡されるので、null にはならない。
続きは、会員登録なしでそのまま50問解けます。採点と解説つきで、上と同じ本物の問題です。
登録なしで50問解く