質問するログイン新規登録

Q&A

解決済

3回答

553閲覧

java17の紫本の模擬試験の誤植?について

ChocoKorone

総合スコア15

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2026/03/24 11:22

編集2026/03/27 12:46

0

0

Java17の紫本の模擬試験にて以下のような問題があります。
正解はACEHだそうなのですが、解説を見ても何故なのか全く分かりません。これは誤植?なのでしょうか?それとも自分の認識が間違っているのでしょうか

ちなみに解説を見ると「トップレベルのクラスに指定できるアクセス修飾子はpublicか省略の形であり、選択肢Aは適切な宣言です。」と書かれています。

解説について昨日は省略していましたが、全文は以下です。
「クラスに指定できる修飾子についての問題です。
トップレベルのクラスに指定できるアクセス修飾子はpublicか省略の形であり、選択肢Aは適切な宣言です。
またprivateやstaticはトップレベルのクラスには指定できない為、選択肢B、Dは間違いです。
選択肢C、Eについてサブクラスによる継承を禁止するクラスにはfinal、抽象クラスにはabstractを指定する為どちらもクラスに指定可能な修飾子です。
ただし、選択肢Fのようにabstractとfinalを両方指定することはできません。
2行目ではシールクラスを宣言しています。permitsによる継承先の限定はありませんが、同一ファイル内でサブクラスを宣言する場合は、シールクラスの継承が必要です。サブクラスにはnon-sealed、sealed、finalのいずれかを指定するため、選択肢Hは正しい記述です。
選択肢Gはシールクラスを宣言していますが、継承を禁止とするfinalが指定されているため間違いです。」

問題

次のプログラムがあります。

java

1sealed class Base {} 2//insert code here

2行目に記述できるクラス宣言として正しいものはどれですか。(4つ選択)
A. public class Derived{}
B. private class Derived{}
C. final class Derived{}
D. static class Derived extends Base{}
E. abstract class Derived{}
F. abstract final class Derived{}
G. sealed final class Derived{}
H. non-sealed class Derived extends Base{}

3/25 補足

  • 選択肢Hについて誤記がありましたので修正しました。

  • Base.javaというのファイル名について、問題中ではjavaファイル名が明言されておらず、この本を買ったらダウンロードできるサンプルプログラムからファイル名からとっています。

  • 解説を全文載せました。

  • 正解とされる選択肢も実際に試行しましたが以下のようになりました。(java version "17.0.16" 2025-07-15 LTS)

  • A
    Base.javaだった場合:Derivedクラスがpublicであるため、ファイル名がおかしい(コンパイルエラー)、Baseクラスを継承しているクラスが一つもない(コンパイルエラー)
    Derived.javaだった場合:Baseクラスを継承しているクラスが一つもない(コンパイルエラー)

  • C
    Base.javaだった場合:Baseクラスを継承しているクラスが一つもない(コンパイルエラー)
    Derived.javaだった場合:Baseクラスを継承しているクラスが一つもない(コンパイルエラー)

  • E
    Base.javaだった場合:Baseクラスを継承しているクラスが一つもない(コンパイルエラー)
    Derived.javaだった場合:Baseクラスを継承しているクラスが一つもない(コンパイルエラー)

  • H
    Base.javaだった場合:コンパイル成功
    Derived.javaだった場合:コンパイル成功

アドバイス通り、お問い合わせフォームに送ってみます。
回答された方ありがとうございました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

maisumakun

2026/03/24 23:14

逆にうかがいますが、 ・Aはなぜ選択肢から外れると考えましたか? ・Aを外すとして、正しいもの4つはどれになると考えましたか?
jimbe

2026/03/27 12:09

関係するか分かりませんが、java コマンドでソースを直接実行する場合とかはファイル名と public クラス名が一致しなくても良かったような…。
guest

回答3

0

ベストアンサー

誤植の可能性が高いです
まずトップレベルにおけるpublic classの命名はファイル名との一致が必須です
内部クラスとしての定義を前提にしてもBaseのスコープは1行目で閉じられているので2行目でDerivedはトップレベルに配置されます
よってpublic class Derived{}は宣言できません
そのためpublicを修飾できるのはBaseのみです
選択肢についても問題があり、non-sealed final class Derived{}は無効の宣言です
finalは宣言できず、Derivedの後にはextends Baseが必要です

sealed class A permits B{ } non-sealed final class B extends A{ }
prog.java:11: error: illegal combination of modifiers: final and non-sealed non-sealed final class B extends A{ ^ 1 error

またこのサンプルコードの通りsealed classにはpermitsが必要です
Baseであればpublic sealed class Base permits Derived{}が有効な形式です
これらを踏まえると選択肢として有効なのはCEとなります
解説と選択肢に誤認が見受けられるので、他言語の書式と混同されている可能性が高いです
一度問い合わせるべきでしょう

投稿2026/03/24 23:22

編集2026/03/24 23:27
Manabu

総合スコア154

maisumakun

2026/03/24 23:30

> またこのサンプルコードの通りsealed classにはpermitsが必要です 同じファイルに書いた場合にはpermitsを省略できます。 https://openjdk.org/jeps/409
Manabu

2026/03/24 23:44 編集

訂正ありがとうございます メインクラスでは省略可能ですね 一方sealed classは派生を持たなければならないので、子クラスでextendsが必須です non-sealed class Derived extemds Base{} がない場合 prog.java:1: error: sealed class must have subclasses sealed class Base{ ^ 1 error となるので問題文では```Base```が宣言できません
ChocoKorone

2026/03/25 12:54 編集

ファイル名や選択肢Hの内容など自分の提示した前提がおかしいせいで、一部内容が違ってしまっていますが せっかく考えて頂いたため、こちらの方をベストアンサーにします。ありがとうございました。
guest

0

アドバイス通り出版社に問い合わせます。
最初からそうすればよかったですね、お目汚し申し訳ないです。

投稿2026/03/25 12:36

ChocoKorone

総合スコア15

0

トップレベル=1行目ということはなく、クラス内のクラスに該当していないことを指します。
例えば、

Java

1public class Base { 2 class Sub {} 3} 4class Other {}

とあった場合は、BaseとOtherがトップレベルです。

投稿2026/03/24 23:22

編集2026/03/24 23:22
fiveHundred

総合スコア10539

fiveHundred

2026/03/24 23:26 編集

うっかりスルーしてしまいましたが、ファイル名とpublicクラス名は一致する必要があります。 従って、Base.javaという名前で「public class Derived{}」は動作しませんが、これは質問者さんの引用時の誤記だと判断しております。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.29%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問