Silverでは、継承、例外、基本API、スコープ、Java 17の言語構文などが同じコードに重なったときにJavaのルールを崩さず追えるかが重要です。長いコードを全部頭に保持するより、コンパイル・型・実行順を段階的に切り分けます。
更新日 2026-10-05
Java SE 17 Programmer I(Silver) 攻略ガイド
Silverのコードは、個々の構文を知っていても、組み合わさると読み違えやすくなります。親クラス型の変数に子クラスのオブジェクトを代入する、同名メソッドを呼ぶ、途中で例外が発生する。このとき「どの規則が、どの段階で働くか」を分けることが学習の中心です。
Bronzeのように値を追う力を土台にしながら、Silverでは宣言の成立、参照型から使えるメンバー、実行時の動作を順番に確認します。Java 17で加わる学習項目も、以前のJavaとの違いをコードで確かめます。
このページ内のミニケース、コード、計算例は、学習方法を説明するために資格合格.webが独自に作成したものです。実際のJava SE 17 Programmer I(Silver)の非公開試験問題を転載・再現したものではありません。
開始前に、SE 17の範囲と受験日を合わせる
2026-10-05確認時点のOracle試験案内では、1Z0-825-JPNは選択問題・90分・60問です。同時に配信終了試験一覧には、2027年2月28日の配信終了予定が掲載されています。SE 17で受験する計画を立てる場合は、学習期間と予約可能な日程を先に確認してください。
このガイドではJava 17を基準に読みます。最新版のJDKで動いたからといって、Java 17でも成立するとは限りません。教材、実行環境、受験する試験番号の三つをそろえます。公式チェックリストには、基本構文に加え、テキストブロック、switch式、レコード、instanceofのパターンマッチング、シールクラスなども含まれます。
参照型と実体を、二つの欄に分ける
次の例は一つのファイルへ保存して確認できます。item の宣言型と、new で生成した型を先に書き出します。
class Parent {
String name = "parent";
String label() { return "P"; }
}
class Child extends Parent {
String name = "child";
@Override String label() { return "C"; }
}
class Main {
public static void main(String[] args) {
Parent item = new Child();
System.out.println(item.name + ":" + item.label());
}
}
出力は parent:C です。フィールドアクセスの item.name は参照型を基準に解決されます。一方、オーバーライドされたインスタンスメソッド label() は実体のクラスに応じた処理が呼ばれます。同じ変数から呼んでいても、選択の規則が同じではありません。
参照型と実体
参照型と実体。宣言型はParent:Parent item = new Child(); の左辺が参照型。実体がChildでも使えるメンバーは別途判定。 フィールドは参照型:item.nameはParent側のフィールドを参照し、値はparent。 実体はChild:new Child()で生成した実体に応じ、上書きされたlabel()はCを返す。 組み合わせた出力:item.name + ":" + item.label()はparent:C。フィールドとメソッドで規則が違う。
- 宣言型はParentParent item = new Child(); の左辺が参照型。実体がChildでも使えるメンバーは別途判定。
- フィールドは参照型item.nameはParent側のフィールドを参照し、値はparent。
- 実体はChildnew Child()で生成した実体に応じ、上書きされたlabel()はCを返す。
- 組み合わせた出力item.name + ":" + item.label()はparent:C。フィールドとメソッドで規則が違う。
ここから Child にだけ存在するメソッドを追加し、親クラス型の item から直接呼べるか考えます。実体が子クラスであるという事実だけでは、参照型に存在しないメソッドをそのまま呼べません。キャストがある問題では、コンパイル時に許されるかと、実行時の実体がキャスト先に適合するかを別に確認します。
オーバーロードを選んでから、オーバーライドを考える
名前が同じメソッドを見たら、まず引数リストを比較します。オーバーロードなら、呼び出し時の引数の型から候補が解決されます。オーバーライドなら、継承元のメソッドを適切に上書きしているかを確認し、その後で実体による呼び出しを追います。
override判定
override判定。引数とメソッド種別:print(Object)とprint(String)は別の引数型。staticの隠蔽もoverrideとは分ける。 戻り値の適合:同じ戻り値型か、参照型で認められる共変戻り値か確認する。 アクセスとチェック例外:アクセスを継承元より狭めない。チェック例外を不適切に広げない。 候補選択と実体:コンパイル時にoverloadを解決。overrideされたインスタンスメソッドは実体で呼び分ける。
- 引数とメソッド種別print(Object)とprint(String)は別の引数型。staticの隠蔽もoverrideとは分ける。
- 戻り値の適合同じ戻り値型か、参照型で認められる共変戻り値か確認する。
- アクセスとチェック例外アクセスを継承元より狭めない。チェック例外を不適切に広げない。
- 候補選択と実体コンパイル時にoverloadを解決。overrideされたインスタンスメソッドは実体で呼び分ける。
| 点検するもの | 確認する内容 |
|---|---|
| 引数 | 型や個数が変わって別のオーバーロードになっていないか |
| 戻り値 | 同じ型、または認められる共変戻り値になっているか |
| アクセス | 継承元より狭いアクセスにしていないか |
| 例外宣言 | チェック例外を不適切に広げていないか |
| メソッド種別 | staticの隠蔽を、インスタンスメソッドの上書きと混同していないか |
例えば親に print(Object value)、子に print(String value) があっても、引数型が異なるので、それだけで上書きにはなりません。@Override を付けてコンパイラに判定させると、思い込みを早く発見できます。
継承の練習では、アクセス修飾子やコンストラクタも組み合わせます。コンストラクタは継承されるメソッドではありません。親の初期化を呼ぶ経路、子のフィールド初期化、子のコンストラクタ本体を順番に書き、出力行の順番で確認します。
例外は「次に実行する場所」を矢印で追う
例外処理は、最後に出る文字だけ覚えても安定しません。例外が発生した行から、対応するcatchへ移るか、finallyを通って外へ伝わるかを描きます。
try {
System.out.print("A");
Integer.parseInt("x");
System.out.print("B");
} catch (NumberFormatException e) {
System.out.print("C");
} finally {
System.out.print("D");
}
System.out.print("E");
この例をメソッド内へ置くと、出力は ACDE です。parseInt で例外が発生するため B は実行しません。catchの処理後にfinallyへ進み、ここでは外側の E まで到達します。
例外経路
例外経路。try:Aの後に例外:Aを出力。parseInt("x")でNumberFormatExceptionが発生し、Bへは進まない。 catch:Cを出力:対応するNumberFormatExceptionのcatchへ移り、Cを出力する。 finally:Dを出力:この例ではcatchの後にfinallyへ進み、Dを出力して正常に終わる。 tryの外:Eを出力:例外はcatchで処理済み。外側のEに到達し、全体の出力はACDE。
- try:Aの後に例外Aを出力。parseInt("x")でNumberFormatExceptionが発生し、Bへは進まない。
- catch:Cを出力対応するNumberFormatExceptionのcatchへ移り、Cを出力する。
- finally:Dを出力この例ではcatchの後にfinallyへ進み、Dを出力して正常に終わる。
- tryの外:Eを出力例外はcatchで処理済み。外側のEに到達し、全体の出力はACDE。
チェック例外では、捕捉または適切なthrows宣言が必要かもコンパイル段階で確認します。catchの並び順、multi-catchの型同士の関係、try-with-resourcesで閉じる対象を、それぞれ独立した確認項目にしてください。
finallyにreturnがあると、先に準備された戻り方が変わる場合があります。これは実務の書き方として推奨するための練習ではありません。どの終了経路が残るかを理解するため、returnやthrowの位置を図へ書き込みます。
String、StringBuilder、ArrayListは状態の変化が違う
String は変更するように見える操作でも、元の文字列オブジェクトを書き換えるとは限りません。戻り値を受け取ったか確認します。StringBuilder はそのオブジェクトの内容を変更する操作があり、同じ参照を持つ変数から変化が見えます。文字列の == と equals も、参照の同一性と内容の比較を分けます。
コレクション状態変化
コレクション状態変化。初期状態:[10,20,10]:ArrayList<Integer>は3要素。以後はremoveの引数型と操作後の状態を追う。 remove(1):添字で削除:intの1は添字。20を取り除き、戻り値は20、内容は[10,10]、sizeは2。 remove(Integer.valueOf(10)):Objectを取る候補で最初の値10を削除。戻り値はtrue、内容は[10]、sizeは1。 結果を出力:[10]:二つのremoveを同じ規則で読まない。引数型が候補と戻り値型を決める。
- 初期状態:[10,20,10]ArrayList<Integer>は3要素。以後はremoveの引数型と操作後の状態を追う。
- remove(1):添字で削除intの1は添字。20を取り除き、戻り値は20、内容は[10,10]、sizeは2。
- remove(Integer.valueOf(10))Objectを取る候補で最初の値10を削除。戻り値はtrue、内容は[10]、sizeは1。
- 結果を出力:[10]二つのremoveを同じ規則で読まない。引数型が候補と戻り値型を決める。
ArrayListで特に混同しやすいのは、remove(int index) と remove(Object value) です。
java.util.ArrayList<Integer> values =
new java.util.ArrayList<>(java.util.List.of(10, 20, 10));
values.remove(1);
values.remove(Integer.valueOf(10));
System.out.println(values);
メソッド内で実行した結果は [10] です。最初は添字1の20を削除し、次は値10に一致する最初の要素を削除します。「removeは要素を消す」だけでは候補を選べません。引数の型、戻り値、操作後のサイズまで書きます。
配列もArrayListも、要素を追加・削除できる条件や、長さ・サイズの取り出し方が違います。APIを横並びで暗記するより、一連の追加・取得・削除を小さな表にして追うと、状態の読み違いを修正できます。
Java 17の構文は、短い対比で覚える
新しい構文をすべて「記述が短くなる機能」として覚えると、制約を見落とします。次の比較を一つずつコードにします。
var:初期化式から型が決まるローカル変数型推論。何でも代入できる変数になるわけではありません。var value = null;だけでは型を決められません。- switch文とswitch式:文として分岐する場合と、値を返す式として使う場合を区別します。式のブロックで値を返す
yieldの位置を確認します。 - レコード:コンポーネントと生成されるアクセサを確認します。参照するオブジェクトの内部状態まで自動的に不変になるとは考えません。
- シールクラス:継承を許可された型と、その型に求められる宣言を確認します。
final・sealed・non-sealedの役割を区別します。 - instanceofのパターン変数:パターンが成立することを確認できる範囲で、その変数を使用できるか読みます。
一度に長いサンプルへ詰め込まず、成立する宣言と、条件を一つ変えて成立しなくなる宣言を並べます。失敗例ではコンパイラのエラー全文を覚えず、「型が推論できない」「継承の許可条件を満たさない」と理由を言葉にしてください。
ラムダの図は、Goldへ広げるときの補助にする
関数型→ラムダ
関数型→ラムダ。対象型を読む:左辺などの文脈にある関数型インタフェースが、ラムダの対象型になる。 抽象メソッドと対応:対象の抽象メソッドの引数・戻り値に、ラムダの形を合わせる。 引数と結果を確認:Predicate<String>ならStringを受け取りbooleanを返す形。s -> s.isEmpty()が一例。 Goldへ進む際の補助:この図は対象型を読む補助。Silverでは公式範囲の継承・例外・基本API・構文を優先。
- 対象型を読む左辺などの文脈にある関数型インタフェースが、ラムダの対象型になる。
- 抽象メソッドと対応対象の抽象メソッドの引数・戻り値に、ラムダの形を合わせる。
- 引数と結果を確認Predicate<String>ならStringを受け取りbooleanを返す形。s -> s.isEmpty()が一例。
- Goldへ進む際の補助この図は対象型を読む補助。Silverでは公式範囲の継承・例外・基本API・構文を優先。
既存のラムダの図を見るときは、左辺の対象型から引数と戻り値の形が決まる、という読み方を確認できます。ただし、関数型インタフェースやStreamを先に深掘りしてSilverの中心学習にする必要はありません。2026-10-05に確認したSilverの公式チェックリストを優先し、本格的なラムダ・メソッド参照・Streamの学習はGoldの範囲と照合して進めます。
Silverで先に安定させたいのは、継承、例外、基本API、Java 17の言語構文です。前の版の問題集や上位試験の教材を使う場合は、分野名が似ているだけで同じ範囲と判断しないでください。
間違いノートは「規則を切り替える地点」を残す
複合コード復習
複合コード復習。誤った規則を特定:フィールドとメソッド、overrideとoverloadなど、取り違えた地点を一行で残す。 規則を確認して演習:教材で宣言型・実体・引数型・例外経路を確認し、問題へ当てはめる。 Java 17で照合:迷ったコードをJava 17で検証し、予測と違った根拠を調べる。 実行せず再判定:紙に候補や経路を書いて説明する。迷えば該当規則へ戻って次の演習へ。
- 誤った規則を特定フィールドとメソッド、overrideとoverloadなど、取り違えた地点を一行で残す。
- 規則を確認して演習教材で宣言型・実体・引数型・例外経路を確認し、問題へ当てはめる。
- Java 17で照合迷ったコードをJava 17で検証し、予測と違った根拠を調べる。
- 実行せず再判定紙に候補や経路を書いて説明する。迷えば該当規則へ戻って次の演習へ。
Silverでは、正解の番号を記録するより、どの段階で誤った規則を使ったかを残す方が復習しやすくなります。
| 自分の読み違い | 次の演習で行う確認 |
|---|---|
| 実体がChildだからフィールドもChildを見た | フィールドかインスタンスメソッドかを先に分類する |
| 同名ならすべてoverrideだと思った | 引数リストを並べて比較する |
| 例外発生後もtryの残りを追った | 発生行からcatchへ矢印を引く |
| Integerのremoveは常に値の削除だと思った | 呼び出しの引数型を書く |
| 新しいJDKでの結果をSE 17にも当てはめた | 使用する言語バージョンを確認する |
教材で規則を確認したら、問題演習でその規則を使い、迷ったコードをJava 17の環境で検証します。その後は実行せず、宣言型、実体、メソッドの候補、例外経路を紙に書いて再判定してください。動かした結果を覚えただけなら、この再判定で止まります。
模擬試験では、長いコードを全部抱え込まない
最初にクラス関係と宣言を点検し、実行まで進めるコードだけをトレースします。表示に関係する変数、上書きされるメソッド、例外が発生する箇所へ印を付けると、読み返す範囲が絞れます。
不正解は、知識不足、コンパイル判定の誤り、実行経路の誤りに分けます。時間を使いすぎた正解も、どこで候補を減らせたか振り返ってください。弱点分析では継承などの分野名だけでなく、フィールドアクセスとメソッド呼び出しの混同のように一段具体的な原因を残します。
公式仕様と、このサイトの演習をつなぐ
オーバーライドやクラス宣言の根拠はJava 17言語仕様のクラスで確認できます。先に短い例で疑問を絞り、仕様へ戻ると読みやすくなります。申込条件や試験範囲は資格情報ページとOracleの試験案内を最終確認先にしてください。
基礎構文が不安なら学習教材へ、規則を混同するなら問題演習へ進みます。繰り返す誤りは弱点分析で整理し、模擬試験では宣言と実行を分ける読み方を時間内でも保てるか確かめます。Silverの完成度は、コードが少し変わっても同じ規則を正しく使えるかで測ります。