Java SE Bronze(1Z0-818)合格体験記

## はじめに
Qiita初投稿になります。
今年の7月に開発実務未経験による転職を経て大阪の開発会社で働いてます。
本試験は、Javaの知識がどこまで身についているのか目に見える形として証明したかったというのと、Javaの基礎力向上を目的に資格試験にチャレンジしてみたという経緯です。

## 私のスペック
- 元インフラ運用屋
- Java未経験（もちろん開発実務も経験ありません）
- 少しPHP触ったことがある

## 申込み注意点
- 申込みの手順がかなり複雑
- 試験名に注意
<br/>
はじめに、"申込みの手順がかなり複雑"については、私が解説するよりも既にわかりやすい記事がありますので、[こちらの記事](https://qiita.com/Channel/items/31e50323d2b7ee78f7cc)を参照ください。<br/>
[こちらの記事](https://qiita.com/yoshidayoshidayoshida/items/3b6a4ad8dc48b92af9d8#%E8%A9%A6%E9%A8%93%E6%B3%A8%E6%84%8F%E7%82%B9)も試験を受ける上で大変参考になりましたので、共有致します。<br/><br/>
続いて、"試験名に注意"に関してですが、既にご存知の方は大丈夫なのですが、「Java SE 7/8 Bronze(1Z0-814)」という試験は今年(2020年)の7/31に配信を終了しています。[こちらのリンク](https://education.oracle.com/ja/java-se-7-8-bronze-japan-only-exam/pexam_1Z0-814)から辿って頂けると確認できると思います。<br/>
**後継版の試験名は「Java SE Bronze(1Z0-818)」**なので、ご注意を。ピアソンVUEの検索窓にて**1Z0-818だけでも検索でヒットします**

## 期間（学習時間）
- 2週間程度
- 平日6~9時間（その他業務もあり、多少のばらつきがあります）
- 休日5時間程度
- 合計：80時間~110時間程度
<br/>
私の良くないところで、時間がある分怠けてしまいがちです。期限が迫ってきてようやく焦るようなダメ人間です。何事もはじめに期間を決めると良いかもしれませんね（自戒）<br/>
私からアドバイスとしては、平日も休日も一定の学習時間を確保できるのであれば、本試験は2週間（デキル方なら1週間みっちり）で十分です。<br/>貴方が設定した期間から逆算して毎日コツコツ学習していきましょう！

## 学習方法
- [参考書（紫本）](https://www.amazon.co.jp/%E3%82%AA%E3%83%A9%E3%82%AF%E3%83%AB%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E6%95%99%E7%A7%91%E6%9B%B8-Java%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E-Bronze-SE-%E5%B1%B1%E6%9C%AC/dp/4798142719)
- 苦手分野をググって理解できるまで学習（Qiitaの記事など）
- 実際にコードを書いてデバッガ置いて処理を追う
<br/>
上記3点のみです。<br/>
紫本を合計3周ほどしましたが、2周くらいに留めておいてネットでも違う書籍でも良いので、まだ解いたことのない問題を解くべきでした。<br/>
また、私の場合"オーバーロード・オーバーライド"や"for文のネスト"問題に苦戦していたので、問題に躓く度にググって、実際にコードを書いてデバッグしてプログラムの流れを理解するようにしていました。

## 直前チェック
- [ ]  JVM<br/>
**クラスファイルを読み込む**<br/>
クラスファイル内に書かれた**バイトコードを解釈して実行**（クラスファイルを実行すること）<br/>
**メモリ管理**
<br/><br/>
- [ ]  識別子<br/>
識別子（変数、メソッド、クラスなど、、）の1文字目は、**英字(a~z, A~Z), ($), (_)**のみ<br/>
2文字以降は数字も可能<br/>
文字数の制限はない
<br/><br/>
- [ ]  char型<br/>
char型はUnicode（16ビット）で表現できる1文字であり、**文字列と区別される**<br/>
char型は符号なし整数（1とか5とか）を扱うことができる<br/>
char型に**Unicode値を格納する場合は、シングルクォート（'）で囲む**<br/>
ダブルクォート（"）で囲んだ場合は文字列となる
<br/><br/>
- [ ]  基本データ型のデフォルト値<br/>
整数値：0<br/>
浮動小数点型：0.0<br/>
boolean型：false<br/>
char型：**￥u0000**<br/>
参照型：null
<br/><br/>
- [ ]  if文<br/>
if文では、処理する文が1行しかない場合、{}を省略してもよい<br/>
しかし、2行以上の処理を記述した場合は、条件式の結果に関係なく実行される
<br/><br/>
- [ ]  switch文<br/>
switch文の式の結果は、データ型として<byte>, **short**, **int**, **enum**, **char**, **String**のいずれかの値である必要がある（問題のはじめに確認する方が良さそう）
<br/><br/>
- [ ]  while文<br/>
while(false) と記述するとコンパイルエラーになる
<br/><br/>
- [ ]  拡張for文<br/>
変数宣言と参照変数名の変数のデータ型は合わせないとコンパイルエラーになる<br/>
**変数宣言はfor文の中で宣言する必要がある**。外で宣言するとコンパイルエラーになる
<br/><br/>
- [ ]  コンストラクタ<br/>
コンストラクタ名はクラス名と同じ<br/>
すべてのアクセス修飾子を指定できる<br/>
**戻り値**,  **void**, **abstract**, **static**, **final**は指定不可<br/>
**戻り値を指定するとコンストラクタではなくメソッドになる**ので注意<br/>
**サブクラスに引き継がれない**
<br/><br/>
- [ ]  メンバ<br/>
インスタンスメンバはクラスがインスタンス化されると、格オブジェクトの中に**個々の領域が確保**される<br/>
staticメンバは複数インスタンス化されても**一箇所で領域が確保**される
<br/><br/>
- [ ]  メンバ間アクセス<br/>
インスタンスメンバ　->　staticメンバに直接アクセスはOK<br/>
staticメンバ　->　インスタンスメンバに直接アクセスはNG<br/>
staticでアクセス場合は、インスタンス化する必要がある
<br/><br/>
- [ ]  アクセス修飾子・修飾子<br/>
publicおよびデフォルト：**クラス**・**コンストラクタ**・**変数**・**メソッド**<br/>
protectedおよびprivate：**コンストラクタ**・**変数**・**メソッド**（**抽象メソッドには使用不可**。**サブクラスでオーバーライドするため**。）<br/>
ローカル変数や制御文（if, for）：**アクセス修飾子は指定できない**<br/>
abstract修飾子：**コンストラクタ**・**変数**には使用不可<br/>
static修飾子：**変数**・**メソッドのみ**
<br/><br/>
- [ ]  final修飾子<br/>
変数　->　定数<br/>
メソッド　->　サブクラス側でオーバーライドできなくなる<br/>
クラス　->　継承不可になる<br/>
**コンストラクタ　->　使用できない**
<br/><br/>
- [ ]  publicなクラス<br/>
publicクラスは1ファイルにつき1つ<br/>
publicクラスを定義した場合、ファイル名も同じにする
<br/><br/>
- [ ]  オーバーロード<br/>
**メソッド名(コンストラクタ名)**が同じ<br/>
**引数の並び**, **引数の型**, **引数の数**が異なることが条件
<br/><br/>
- [ ]  オーバーライド<br/>
**シグネチャ（メソッド名と引数リスト）**が同じ<br/>
戻り値は同じか、その**戻り値の型のサブクラス**であればオーバーライドとみなされる<br/>
アクセス修飾子は、**スーパークラスと同じ**か、**それよりも公開範囲が広い**ものでなければならない<br/>
**インスタンスメソッド(非staticメソッド)をstaticメソッドでオーバーライドすることはできない**
<br/><br/>
- [ ]  継承<br/>
サブクラスで引き継ぐことができるのは**変数**, **メソッド**<br/>
コンストラクタは引き継がれない<br/>
Java言語は単一継承のみをサポートしているため、**extendsキーワードの後に指定できるクラスは一つのみ**<br/>
継承関係のあるクラス（サブクラス）をインスタンス化すると**必ずスーパークラスのコンストラクタから実行**してサブクラスのコンストラクタが実行される<br/>
サブクラス側で明示的に呼び出したいコンストラクタを指定しないと、暗黙的にスーパークラスの引数を持たないコンストラクタが**super()**で呼び出されてしまう
<br/><br/>
- [ ]  抽象クラス<br/>
**抽象クラスを継承した抽象クラスはスーパークラスで定義されている抽象メソッドを実装（オーバーライド）しなくてもエラーにならない**。しかし、継承先が具象クラスであれば実装する必要がある<br/>
**インスタンス化できない**
<br/><br/>
- [ ]  インタフェース<br/>
インタフェース内で変数を宣言する際は、staticな定数**public static final**になるため宣言と同時に初期化する必要がある<br/>
インタフェースを実装する際の抽象メソッドのオーバーライドには必ず**public**をつける必要がある<br/>
extendsとimplementsを併用する際は、**extends**を先に記述する<br/>
抽象メソッドにstatic修飾子は付けられない
<br/><br/>
- [ ]  パッケージ<br/>
パッケージ名を階層化する場合は、階層名をドット< . >で区切る
<br/><br/>
- [ ]  パッケージ・コンパイル・実行<br/>
パッケージ内にあるソースファイルをコンパイルする際はバックスラッシュ< \ >繋ぎになる<br/>
実行する際はドット繋ぎになる
<br/><br/>
- [ ]  パッケージ・public<br/>
自分が所属するパッケージ以外のクラスに自クラスの利用を許可するためには、許可するクラス名とメソッド名に**public**を付ける

## 最後に一言
何とかここまで執筆できたことに安心しております。
執筆中に試験の事や、資格学習について思い返すことが何点かあったので最後にそれをお伝えして終了させて頂きます。<br/>
まず資格学習についてですが、
参考書を何周もして問題に慣れることも大切ですが、”問題を1分以下（理想は50秒）”で解けるようになっておくことの方が大切だと感じました（試験では1問1分ペースを要求されるので）。また、他の方も仰っているように”オーバーロード・オーバーライド”問題の理解度が合否に直結すると言っても過言ではありません。<br/>
試験本番についてですが、
本番は思っている以上に緊張感がエグいので、文章の読解力が普段よりも格段に落ちます（私は初めの5分くらいは緊張のあまり頭が回りませんでした（笑））そのため、緊張するなと言う方が難しいですが、なるべくリラックスして試験に望んでください。<br/>

以上になります。
次はJava Silverですね。