約2週間でJava SE8 Silverに合格した話

先日Java SE8 Silverに合格したので、勉強方法や理解が浅かったポイントなどをまとめます。

**試験結果:**
勉強期間: 約2週間
得点率: 85％（ボーダー65％）

# 受験前の知識
会社の研修ではじめてjavaに触れてから約１年、知識量としては以下のような感じでした。

- 変数の宣言、ループ、条件分岐など基本的な文法は理解できている
- 継承やポリモーフィズムについては言葉の意味は知っているが、いまいち使い方がよくわかっていない
- ラムダ式？よくわからない

# 勉強方法
平日は通勤時間を利用して約１時間、休日は約３時間ずつ勉強しました。参考書はネットで評価が高かった以下を利用。

[徹底攻略 Java SE8 Silver 問題集](https://www.amazon.co.jp/gp/product/4844339931/ref=oh_aui_detailpage_o01_s00?ie=UTF8&psc=1)

この参考書は１２章構成で、1〜9章が例題、10・11章は模擬試験という形式です。

**例題1周目:**
まず1〜9章を1周、すべての問題の解説を読んで分からなかった箇所は要点をノートに書き出します。1章あたりだいたい１時間前後。

**例題2周目:**
続けて1〜9章をもう１周、この時は頭の中で解答理由を説明しながら解きます。解答理由が曖昧な部分はもう一度解説をよく読みました。１章あたり大体30分前後。

**模擬テスト1周目:**
75問×２回分。解いてみると1回目が得点率64％、2回目が得点率70％。合格のボーダーは65％だから、あれこれ落ちるかも・・・？と焦りました。問題数が多いので解答全て精読する余裕はなくまちがえた箇所だけチェック。受験2日前の出来事。

**模擬テスト2周目:**
模擬テスト１回分だけやり直して、得点率80%。なんか受かる気がしてきます。

# 試験結果
得点率85％で合格。（ボーダー65％）

制限時間は150分だったけど、かなり丁寧に解いて50分くらい余りました。
テストセンターで受験したのですが、試験室に入る前に書類の記入や写真撮影があります。注意書き通り15分前には会場につくようにしましょう。

# 感想
これまで自分がいかにコンパイラのエラーメッセージに頼っていたのかがよくわかりました。コードを読んで何が起きるか、正確に理解することは非常に大切だと思うので、次はJava Gold合格を目標に言語仕様をちゃんと学んでいきたいです。

# その他注意点
- 会社から資格取得支援などを受ける際に領収書が必要な場合があると思いますが、領収書は別途Oracleに請求する必要があります。受け取りは数日から〜１ヶ月かかるということなので、余裕を持って申請するとよいです。
- 受験時にはOracleのアカウント取得→ピアソンのアカウント取得→オラクル認定システム（CertView）の初回認証を行うというステップがあります。ピアソンはテスト会場の予約に必要でCertViewは試験の合否を確認するために必要です。ここで注意すべきなのが、ピアソンのアカウントを取得して数日経ってからCertViewの初回認証を行わないと、認証に失敗するという点です。認証に３回以上失敗すると、アカウントがロックされてしまい、それを解除するためにOracleに問い合わせて数日待たなければなりません。私の場合1週間後に初回認証に成功しました。

# 各章のまとめ
以下は勉強する上でまちがえた箇所のまとめです。

### 1章（Javaの基本）
- import文でワイルドカードを使ってもサブパッケージはインポートされない
- 無名パッケージに含まれるクラスには同じ無名パッケージに含まれるクラスからしかアクセスできない

### 2章（Javaのデータ型の操作）
- 数値リテラルのアンダースコアはリテラルの先頭と末尾、記号の前後には記述できない
    - 記号には小数点を表す「.」、long型やfloat型リテラルを表す「L」や「F」が含まれる
- メソッド名などの識別子には予約語は使えず、数字から始めてはいけない。使える記号はアンダースコアと通貨記号（￥や€）のみ。 

### 3章（演算子と判定構造の使用）
- 暗黙の型変換一覧
    - byte → short, int, long, float, double
    - short → int, long, float, double
    - int → long, float, double
    - long → float, double
    - float → double
    - double → 不可

- 同じ文字列リテラルがプログラム内に再度登場するとインスタンスへの参照が使い回しされる（コンスタントプール）
    - new演算子を用いた場合は、その都度インスタンスが生成される　 

- switch分のcase式が返却できる型はint型以下の整数型とそのラッパークラス、文字と文字列、列挙型のいずれか
- switch分のcase値はnullでない定数、もしくはコンパイル時に値が決まるリテラルでなければならない

### 4章（配列の作成と使用）
- 多次元配列の生成時には大カッコを一度にまとめて記述する必要はない（int[][] array[]でもOK）
- 配列の初期化演算子が使用できるのは変数宣言と同時か次元数を明示的に記述した場合のみ
- 配列の初期化演算子とnewを同時に使用する時は要素数を指定するとコンパイルエラー
    - int[] array = new int[2]{1, 2}はダメ

### 5章（ループ構造の使用）
- コードブロックが使用できるのは全てのループ文、分岐、式、代入、return文、tryブロック、throw文

### 6章（メソッドとカプセル化の操作）
- 可変長引数としてまとめられることができるのは、同じ型の引数のみ
- 可変長引数は最後の引数にすること
- プログラマが明示的にコンストラクタを記述した場合、デフォルトコンストラクタは追加されない
- staticイニシャライザは複数定義可能で記述順に実行される

### 7章（継承の操作）
- 継承関係にあってもスーパークラスのコンストラクタとprivateなフィールドは引き継がれない
- サブクラスのインスタンスはスーパークラスのインスタンスと差分のインスタンスからなる
- 継承関係にあるクラスで同名のフィールドが使われている場合、変数の型で宣言された方が使われる
    - メソッドの場合はメソッド内の指示に従う
- アップキャストはコンパイル時に自動で判断される
- ダウンキャストはコンパイラでは判断できないため、キャスト式が必須である
    - できない場合、コンパイルエラーは発生せず実行時例外となる
- サブクラスのコンストラクタの先頭にはコンパイラによりsuper()が自動追加され、実行される 

### 8章（例外の処理）
- catchブロックとfinallyブロックの両方にreturn文がある場合、return文はfinallyブロックにより上書きされる

### 9章（Java APIの主要なクラスの操作）
- ラムダ式の引数が１つの時、引数のカッコを省略可能。
- ラムダ式の処理が１つの時、処理前後の中カッコを省略可能。戻り値がある時はreturn文は記述できない。
- ラムダ式の処理前後の中カッコを省略しない場合は、return文を記述しなければならない。