クラス構造(1ファイルに置ける public トップレベル型は1つ)難易度 標準無料
ファイル Q3.java に次のコードが書かれている。コンパイル結果として正しいものを選べ。
1 public class Q3 {
2 public static void main(String[] args) {
3 System.out.println("hi");
4 }
5 }
6 public class Helper {
7 int value;
8 }
- Aコンパイルエラー(
publicなトップレベル型は1ファイルに1つまで) - Bコンパイル成功・実行して
hiと出力される - Cコンパイルエラー(1ファイルに2つ以上のクラスを書くこと自体が禁止されている)
- Dコンパイル成功。ただし
Helperクラスは別ファイルとして自動生成される
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済
解説
1つの
各誤答が違う理由.java ファイル(コンパイル単位)に複数のトップレベル型(class/interface/enum等)を書くこと自体は可能だが、
public なトップレベル型は1ファイルにつき最大1つという制約がある。さらに、その唯一の public 型はファイル名と同名でなければならない。
本コードには Q3(ファイル名と一致・public)に加え、Helper も public で宣言されている。
public なトップレベル型が2つ存在するためコンパイルエラーになる。
解決するには Helper から public を外す(パッケージプライベートにする)か、Helper を別ファイル Helper.java に分ける。
- B
Helperもpublicで宣言されており、ファイル名Q3.javaと一致する public 型は1つまでという制約に反するため、コンパイル自体が失敗する。 - C1ファイルに複数のトップレベルクラスを書くこと自体は合法。禁止されているのは
public型を複数書くことであり、Helperのpublicを外せば共存できる。 - Djavac にそのような自動分割の機能はない。public 型の重複はコンパイルエラーとして検出されるだけで、自動的にファイルが分割されることはない。
ひっかけ: 「1ファイルに複数クラスを書くこと自体が禁止」だと誤解しやすいが、複数クラスを書くこと自体は合法。禁止されているのはpublic なトップレベル型を2つ以上書くことであり、2つ目以降は
public を外せば同じファイルに共存できる。コマンド例と想定される挙動(未実行)
javac でコンパイル:
Q3.java:6: error: class Helper is public, should be declared in a file named Helper.java
public class Helper {
^
→ コンパイル不成立(実行に至らない)。AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)