Java Bronze 7/8 合格体験記！「ここをもっと勉強しておけばよかった…」と本番で後悔した箇所まとめ&オブジェクト指向ポイント解説

Java Bronze試験は最近できたばかりの試験ということもあり、ネットでの情報が少ないです。受験を考えている方の助けになれるよう、私が実際に受験して「ここをもっと勉強しておけばよかった！」と思った点などをまとめておきます。

#意外と出題される！「JVMの機能」「SE/EE/MEの違い」#
問題集だと「Javaの基本」などのタイトル名で、だいたい第一章で扱われる範囲です。
私はこの部分を後半のオブジェクト指向など難しい部分の勉強に追われて後回しにしてしまい本番で後悔しました。意外とたくさん出題されます。
「**GUIで操作できる独立系のアプリケーションを作るにはSE/ME/EEどれで開発しますか？**」や、「**JVMではどんなことができますか？**」などをしっかり答えられるようにしておきましょう。

#オーバーライド・オーバーロードについて分かってないと合格は難しいかも#
本番の試験ではとにかくメソッドのオーバーライドとオーバーロードについて考えさせられます。この２つが関係する問題は非常に多く、合否を一番分ける要素だと思います。
「**このメソッドをオーバーライド（オーバーロード）するコードとして正しいものはどれ？**」のような問題にしっかり対応できるようにしておきましょう。

#extendsとimplements, 先に書くのはどっち？#
これは個人的に勉強の中で見落としていて本番でわからずに後悔した問題です。
あるクラスがクラスを継承し、かつインターフェースも実装するというときは
class Child **extends** Parent **implements** IF
のように、**必ずextendsを先に書きます。**

#問題集の「知識系問題」を大切に学習しよう#
私はいわゆる「紫本」（オラクル認定資格教科書）で学習をしたのですが、章末や巻末の練習問題のなかに知識系の問題があります。たとえば「**private修飾子を使用可能なメンバは次のうちどれですか？**」のようなものや、「**abstract修飾子が使用可能なものは次のうちどれですか**」など。こうした問題は、とにかく時間に追われる本番中に一から考えていると非常に焦るので、時間のある普段の学習中にしっかりと理解しておくべきです。**65分で60問解くという本番のプレッシャーは想像以上に強烈で文章の読解力が奪われる**ので、事前にしっかり準備すると良いと思います。

#インクリメントの前置・後置による計算結果の違い#
この問題が解けるなら、たぶんしっかり理解できていると思います。

```Sample.java
class Sample {
  public static void main(String[] args) {
    int a = 2;
    int b = 4;
    System.out.print(++a * b++);
  }
}
```
a掛けるbの掛け算ですが、計算順序としては
1) ++a （aに1が足され、a = 3になった）
2) a * b （a = 3, bはまだインクリメントされていないので4のまま）

となるため、実行すると**12**が出力されます。
勉強して試験に臨んでも、いざ本番で出題されると意外とドキドキします。

#オブジェクト指向に関して：こんな感じの問題が出るかも！#
クラス継承、thisやsuperの出現など一番難しい要素が盛りだくさんなオブジェクト指向ですが、本番ではそこまで難しい問題は出なかったです。
クラスの継承に関しては、この問題が解けるなら大体大丈夫じゃないかな…という感じ（※個人的意見ですが）
オブジェクト指向の問題についての注意点をまとめながら、下の問題を解いてみます。
できる限り丁寧に解説しているので、読むのが面倒になってきたら**太字のところだけ読んでいただけるとポイントがわかる**ようになっています。

```Sample.java
class Sample {
  private static int a;
  private int b;
  public static int methodA(){
    return ++a;
  }
  public int methodB(){
    return methodA();
  }
  public static void main(String[] args) {
    Sample obj = new Sample();
    System.out.print(obj.methodB() + " ");
    System.out.print(obj.methodA());
  }
}
``` 
長いコードに見えますが、まず落ち着いて`mainメソッド`がどこにあるか探しましょう。そこから１行ずつ処理を考えていけば大丈夫です。
mainメソッドではまず
**Sample obj = new Sample();**
によって、Sampleクラスのオブジェクト`obj`が作成されました。

まずここで気を付けるべきは、
**`obj`を定義したメソッドがSampleクラスに含まれるか、そうでないか**
です。なぜなら、クラスが違う場合、**private修飾子がついた変数・メソッドにはアクセスすることができず、その時点でコンパイルエラーになってしまう**からです。そういった問題がbronzeでは実際に出題されます。
今回の問題では`obj`を定義したmainメソッドはSampleクラスに含まれているため、クラスに含まれるすべての変数・メソッドに自由にアクセスできます。

次に、
**System.out.println(obj.methodB() + " ");**
があります。`obj`に対してmethodBメソッドの処理をすることになります。

methodBメソッドの内容は、「methodAメソッドを実行して、その結果出てきた値をmethodBに渡して(return)ください！」というものですね。`return`がないと、methodAメソッドが内部で実行されるだけで実行結果を見ることができません。

ここでまた気をつけるべきことがあります。
**methodBがstaticなのか非staticなのか**しっかり確認しましょう。
というのも、**staticなメソッドが非staticなメソッドを呼び出すことはできず、その時点でコンパイルエラーになる**からです。

今回の問題ではmethodBは非static、methodAはstaticメソッドです。
非staticメソッド⇒staticメソッドの呼び出しは問題なく行うことができます。

さて、methodAメソッドの処理に移ります。
**return ++a;**
とあります。「aに１を足した数を答えてください」という指示なのですが、
**「aの値って定義されてないじゃん！」**と戸惑う方もいるかもしれません。

しかし、**クラスのメンバ変数（クラスの中で定義される変数）は生成されると自動的に初期値が代入されて初期化される**というルールがJavaにはあります。
aはint型、int型の初期値は0です。
よって++aは1であり、methodAメソッドの実行結果は1、呼び出し元のmethodBメソッドには1という値が渡されるためobj.methodB()の結果は1になります。

また、ここでも**staticか非staticか**の判別を行いましょう。
methodAはstaticメソッドで、aもstaticメソッドなので問題ありません。
よって、
**System.out.println(obj.methodB() + " ");**　⇒　**「1 」（1のあとに空白）**
となります。

次に、
**System.out.println(obj.methodA());**
を処理します。

先ほどのmethodAメソッドを１回実行すればいいだけの簡単な処理ですが、注意点は
**前に書かれたコードによって値がインクリメントされた記録は残っている**ことです。
前の行の`obj.methodB()`によってmethodAメソッドは一度呼び出されており、初期値の0だったaの値はすでに1になっています。この変化はコードが次の行に移っても保存されているので、`obj.methodA()`によってmethodAメソッドを再度呼び出すと、aの値は1から2になります。
よって、
**System.out.println(obj.methodA());**　⇒　**「2」**となり、
コード全体の出力結果としては**「1 2」**となります。

この問題がすでに分かる方なら、本番のオブジェクト指向系問題はほぼ全問余裕をもって解けると思います。私は本番のとき、プレッシャーのせいで問題がやたら難しく見えていましたが、よく見てみれば簡単に解ける問題ばかりでした。**落ち着いて受験することが何よりも大事**です。

#ひっかけ問題に気をつけて（別ページにまとめてあります！）#
Java資格試験全体がそうなのかbronzeだけなのかわかりませんが、ひっかけ問題が多いです。どんなひっかけ問題があるのかを[こちらのページ](https://qiita.com/AK092/items/b16dbf5ea0ab06126883)にまとめましたので、不安な方は見てみてくださいね！

#これから受験される方、よい結果になりますように！#
Java bronzeは、プログラミング未経験でも丁寧に勉強すればパズルのように面白く試験問題が解けるとてもいい難易度の試験だと思います。
受験される方の合格をお祈りしています！