OracleLevel 2

難易度は Level 1(やさしめ)〜Level 5(難関) の5段階です。

Java Bronze SE (1Z0-818-JPN)のサンプル問題(本番形式・解説付き)

Java Bronze SE (1Z0-818-JPN)(Oracle・Java SE Bronze(Oracle Certified Java Programmer, Bronze SE))の出題形式を、実際の問題で確かめられます。ここに掲載する5問は、無料の会員登録で解ける模試 第1回(60問)の冒頭から抜粋したオリジナル問題です。当サイトは全480問を本番CBT準拠の形式で収録しており、この5問はそのごく一部にあたります。

設問1

次のコード

 1: public class Price {
 2:     public static void main(String[] args) {
 3:         // ここに宣言を記述します
 4:         System.out.println(price);
 5:     }
 6: }

変数 price に 1980 を代入します。行3 に記述する宣言として、コンパイルできるものはどれか。

  • int price = 1_980;(正解)
  • int price = _1980;
  • int price = 1980_;
  • int price = 1,980;

解説

数値リテラルでは、桁と桁の間にアンダースコアを入れて区切れます。1_980 は 1980 と同じ値になります。「int price = _1980;」は誤りです。先頭がアンダースコアの _1980 は数値ではなく変数名として読まれ、宣言が無いためコンパイルエラーになります。「int price = 1980_;」は誤りです。アンダースコアは数字と数字の間にだけ置けます。末尾に置くとコンパイルエラーになります。「int price = 1,980;」は誤りです。カンマは数値の区切りに使えません。宣言の区切りとして読まれ、コンパイルエラーになります。

他の選択肢が誤りである理由

  • 「int price = _1980;」先頭がアンダースコアの _1980 は数値ではなく変数名として読まれ、宣言が無いためコンパイルエラーになります。
  • 「int price = 1980_;」アンダースコアは数字と数字の間にだけ置けます。末尾に置くとコンパイルエラーになります。
  • 「int price = 1,980;」カンマは数値の区切りに使えません。宣言の区切りとして読まれ、コンパイルエラーになります。

設問2

次のコード

 1: public class Switcher {
 2:     public static void main(String[] args) {
 3:         boolean on = false;
 4:         if (on = true) {
 5:             System.out.println("lit");
 6:         } else {
 7:             System.out.println("dark");
 8:         }
 9:         System.out.println(on);
10:     }
11: }

このプログラムを実行したときの出力はどれか。

  • dark と false が、この順に1行ずつ出力されます。
  • lit と true が、この順に1行ずつ出力されます。(正解)
  • dark と true が、この順に1行ずつ出力されます。
  • 行4 でコンパイルエラーになります。

解説

行4 の on = true は比較ではなく代入です。代入式の値は代入後の on の値 true なので、if の条件が真になって lit が出力され、行9 では書き換わった true が出力されます。「dark と false が、この順に1行ずつ出力されます」は誤りです。行4 は on と true を比べる式ではなく、on に true を代入する式なので、条件は真になります。「dark と true が、この順に1行ずつ出力されます」は誤りです。条件は代入後の値 true で判定されるため、else 側の dark は出力されません。「行4 でコンパイルエラーになります」は誤りです。代入先の on が boolean なので代入式の型も boolean になり、if の条件として書けます。

他の選択肢が誤りである理由

  • 「dark と false が、この順に1行ずつ出力されます。」行4 は on と true を比べる式ではなく、on に true を代入する式なので、条件は真になります。
  • 「dark と true が、この順に1行ずつ出力されます。」条件は代入後の値 true で判定されるため、else 側の dark は出力されません。
  • 「行4 でコンパイルエラーになります。」代入先の on が boolean なので代入式の型も boolean になり、if の条件として書けます。

設問3

次のコード

 1: // library/Book.java
 2: package library;
 3: public class Book {
 4:     public static String title() { return "図鑑"; }
 5: }
 6: // store/Shelf.java
 7: import library.Book;
 8: package store;
 9: public class Shelf {
10:     public static void main(String[] args) {
11:         System.out.println(Book.title());
12:     }
13: }

この2つのファイルをまとめてコンパイルしたときの結果はどれか。

  • import 文と package 文はどちらを先に書いてもよいため、コンパイルは成功して 図鑑 と表示されます。
  • 1つのファイルに package 文と import 文の両方は書けないため、行7 でコンパイルエラーになります。
  • Book は library パッケージにあって Shelf からは見えないため、行11 でコンパイルエラーになります。
  • package 文より前に import 文が書かれているため、行8 でコンパイルエラーになります。(正解)

解説

1つのソース・ファイルに書ける文の順番は、先頭が package 文、その次が import 文、最後が型の宣言と決まっています。行7 で import 文を先に書いてしまったため、行8 の package 文がその位置に置けなくなり、コンパイルエラーになります。実測した javac のメッセージは store/Shelf.java:2: エラー: class, interface, enumまたはrecordがありません で、エラーは1個でした。package 文と import 文の順番を入れ替えれば、このコードはコンパイルできます。

他の選択肢が誤りである理由

  • 「import 文と package 文はどちらを先に書いてもよいため、コンパイルは成功して 図鑑 と表示されます。」順番は自由だという読み方です。package 文は import 文よりも前でなければならず、逆にすると置けません。
  • 「1つのファイルに package 文と import 文の両方は書けないため、行7 でコンパイルエラーになります。」package 文と import 文は同じファイルに並べて書けます。禁じられているのは順番を逆にすることです。
  • 「Book は library パッケージにあって Shelf からは見えないため、行11 でコンパイルエラーになります。」行7 の import 文そのものは正しい書き方で、Book は Shelf から使えます。原因は文の順番にあります。

設問4

次のコード

 1: // Kitchen.java
 2: public class Kitchen {
 3:     public static void main(String[] args) {
 4:         System.out.println(Oven.status());
 5:     }
 6: }
 7: // Oven.java
 8: public class Oven {
 9:     static String status() {
10:         return "ready";
11:     }
12: }
13: // 実行したコマンド
14: // javac Kitchen.java
15: // java Kitchen

2つのコマンドを順に実行した結果として正しいものはどれか。

  • Oven.java を指定していないため、コンパイルに失敗します。
  • Oven.java を指定していないため、実行時にクラスが見つからず失敗します。
  • Kitchen.class だけができ、何も表示されずに終了します。
  • Oven.java も一緒にコンパイルされ、ready と表示されます。(正解)

解説

javac は、指定されたソースファイルが使っているクラスを同じディレクトリから探し、まだクラスファイルが無ければそれもコンパイルします。ここでは Kitchen が Oven を使っているため、Oven.java も一緒にコンパイルされます。JDK 17.0.20.1 の実測では、javac Kitchen.java の直後に Kitchen.class と Oven.class の両方ができ、java Kitchen の出力は ready の1行でした。

他の選択肢が誤りである理由

  • 「Oven.java を指定していないため、コンパイルに失敗します。」使っているクラスのソースファイルが同じディレクトリにあれば、javac がまとめてコンパイルします。実測でもコンパイルは正常に終了しました。
  • 「Oven.java を指定していないため、実行時にクラスが見つからず失敗します。」実測では Oven.class も作られていたため、実行時にクラスが見つからないことはありませんでした。
  • 「Kitchen.class だけができ、何も表示されずに終了します。」行4 に表示の文があるため、何も表示されずに終わることはありません。Oven.class も作られていました。

設問5

次のコード

 1: class Logger {
 2:     void write(int v) { System.out.println("int"); }
 3:     void write(double v) { System.out.println("double"); }
 4:     void write(String v) { System.out.println("String"); }
 5: }
 6: public class Main {
 7:     public static void main(String[] args) {
 8:         Logger log = new Logger();
 9:         log.write(7);
10:         log.write('A');
11:     }
12: }

このプログラムを実行したときに成り立つ記述はどれか。(2つ選択)

  • 行9 は最後に宣言された行4 の write が選ばれ、String と出力されます。
  • 行10 の 'A' は文字なので行4 の write が選ばれ、A と出力されます。
  • 行9 は引数の型が一致する行2 の write が選ばれ、int と出力されます。(正解)
  • 行10 の 'A' は char なので、拡大変換で届く行2 の write が選ばれ、int と出力されます。(正解)
  • 行10 は引数の型が一致する宣言が無いため、コンパイルエラーになります。

解説

同じ名前のメソッドを引数の型や個数を変えて複数宣言することをオーバーロードといい、どれが呼ばれるかは実引数の型から決まります。まず型がそのまま一致するものが探され、見つからなければ、値の幅が広がる向きの暗黙の変換で届くものが探されます。行9 の 7 は int なので、行2 の write(int) がそのまま一致して選ばれ、int と出力されます。行10 の 'A' は char で、char を受け取る宣言はありませんが、char は int へ広げられるので行2 の write(int) に届きます。char から double へも広げられますが、より近い int の方が選ばれるため、出力は int になります。宣言を書いた順序は選択に関係しません。

他の選択肢が誤りである理由

  • 「行9 は最後に宣言された行4 の write が選ばれ、String と出力されます。」どのオーバーロードが選ばれるかは実引数の型で決まり、宣言を書いた順序は関係しません。行9 は write(int) が選ばれます。
  • 「行10 の 'A' は文字なので行4 の write が選ばれ、A と出力されます。」char を受け取る write は宣言されていません。char は int へ広げられるので write(int) が選ばれ、int と出力されます。
  • 「行10 は引数の型が一致する宣言が無いため、コンパイルエラーになります。」型がそのまま一致する宣言が無くても、暗黙の拡大変換で届くものがあれば選ばれます。行10 は write(int) に届くためコンパイルできます。

続きは、会員登録なしでそのまま50問解けます。採点と解説つきで、上と同じ本物の問題です。

登録なしで50問解く