2022年3月末にJavaSilver取得したため、整理も兼ねてまとめをしたいと思います
黒本をメインに勉強を進めており、何回か間違えた問題というものがありました
そこで自身の理解を深めるのと同じようにJavaSilverの取得を目指す方に向けて、以下の点をまとめていこうと思います
- どう勉強を進めたか
- 黒本について
- よく間違えた箇所
また、自分はPythonを少し書ける程度のプログラミングの知識は持っているので、その前提で進めていきます
どう勉強を進めたか
まず勉強の進め方について記載していきます
一番初めに「スッキリわかるJava入門 第3版」でJavaの基本的な構文や考え方を学びました
ここで基本構文を学ぶのはとても重要で、黒本では基本構文は教えてくれません
そのため、黒本を進める上である程度の基礎を学んでおいたほうが進めやすいかと思います
必ずしも上記の本で学ぶ必要はないとは思いますが、プログラミング初心者の方でも読みやすい内容だと感じました
黒本の読み進め方について
以下のような流れで黒本を読み進めていきました
- 一章ごとに問題を全て解き、採点をしつつ解説を見て理解を深める
- 「1」を全ての章で行う
- 2週目も「1, 2」と同じように行う
- 3週目は「3」で間違えた箇所のみを「1, 2」と同じように行う
- 移行ループ
正直、問題数も多く、かなり時間がかかりました(上記「1, 2」を80問で2, 3時間くらい)
周回数的には4週ほどで、時間をかけたのもあり、理解はかなり深めることができました
よく言いますが、問題の答えを覚えるのではなく、問題を理解して考えて解くというのがとても重要だと感じました
なるべく時間をかけたくない方は、「3」を飛ばすなどして苦手な箇所を重点的に進めていくのが良いかと思います
時間をある程度取れるかたは自分と同じように進めていけば、理解は深められるかと思います
黒本について
黒本を読む前は、「スッキリわかるJava入門 第3版」の内容だけ黒本に出てくるのかと思っていたので、スッキリわかるJava入門以外の新しい内容もたくさん出てきたため、少し驚きがありました
その点も踏まえて、スッキリわかるJava入門をサクッと終わらせて、黒本を重点的に進めていくほうが効率的だと感じました
問題数も全340問と多く、また項目ごとに章分けされているので苦手な項目の対策というのも取りやすいです
問題もかなり網羅的でJavaSilver取得を目指す上で差し支えないと感じました
また、実際に試験を受けてみて思ったのが、ほとんど黒本に載っている問題ばかりで「総仕上げ問題」を解いたときと同じ正答率になって驚きでした
なので黒本で合格点以上(大体6割)を取れる方は合格できるのではないかと思います
よく間違えた箇所
無名パッケージのクラスは無名パッケージのクラスからのみアクセスできる
package ex4; // line1
public class Test {}
//line1のようにパッケージ宣言されているものはわかりやすいのですが、パッケージ宣言がされていない場合、無名パッケージに属することになります
自分は何かとこのパッケージ宣言を見落として、無名パッケージに属しているのに、他のパッケージに属していると勘違いすることが多かったです
検査例外と非検査例外
「Exception」のサブクラスである「RuntimeException」含む「RuntimeException」のサブクラスは非検査例外
「Exception」のサブクラスである「RuntimeException」のサブクラス以外の「Exception」のサブクラスは検査例外
これは非検査例外だからcatchしなくてもいいとか、これは逆に検査例外だからcatchするなどは、try-catch文でよく出題されるところなので覚えておきたいところです
Lambda式
スッキリわかるJava入門では出てこないかつネットで調べてもあまり理解ができない箇所でした
YouTubeで何かわかりやすい解説はないかと調べていたところ、黒本著者である志賀澄人さんがやられているYouTubeチャンネルでLambda式の解説がされていました
とても丁寧でわかりやすく解説がされているので、自分と同じような方はぜひ一度ご覧いただきたいです
Lambda式以外にも様々な解説がされているので、とても勉強になりました
オーバーライドとオーバーロード
ここの区別とどうなったらオーバーライドなのか、どうなったらオーバーロードなのか、は絶対に出題される箇所なので覚えておいたほうが良いと思います
以下は自分なりにまとめたオーバーライドとオーバーロードについてです
オーバーライド | オーバーロード | |
説明 | スーパークラスに定義されたメソッドをサブクラスで再定義すること | スーパークラスの定義に加え、サブクラスに新しい定義を追加(再定義)すること スーパークラスで定義されたメソッドとサブクラスでオーバーロードしたメソッドの両方が存在することになる |
ルール | ・シグニチャ(メソッド名、引数リストの型、数、順番)が同じであること ・共変戻り値があり、同じ型かサブクラスであればオーバーライドしたメソッドの戻り値型に違う戻り値を指定できる ・アクセス修飾子は同じか緩くすること | 引数の数や型、順番が異なる同名のメソッドを定義すること |
ローカル変数とフィールドの宣言について
変数を宣言したときに、自動的に初期化されるのかされないのかについてです
自動的に初期化されるものがあったり、明示的に初期化しないといけないものがあったりと、結構ごちゃまぜになっていました
ローカル変数は初期化をしないと参照不可
フィールドは自動的に初期化されるため参照可能
というのは覚えておいたほうが良いと思いました
まとめ
先述の通り、基本的に黒本で合格点を取れる方は合格できると思います
ただ気を付けてもらいたいのが、問題を暗記するのではなく、考えて解くというのが重要です
黒本と全く同じ問題かというとそうではなく、同じ系統の問題が出題されるため、解き方をしっかり理解している必要があります
自分は勉強を始めてから2か月ほどで取得しましたが、毎日時間を取れる方は一か月ほどでも取れてしまうのではないかと思いました
次はGold目指して頑張ります
以下は簡単なメモ書きですが、黒本で間違えた箇所についてメモをしていたので暇な方は見ていただければと思います
1-4
無名パッケージは無名パッケージからしかアクセスできない
1-7
コンパイルしなくても「java xxx.java」で実行可能
1-8
スペースによって起動パラメータが分解される
2-1
bool型というのは存在せず、boolean型
2-3
_の使用可能箇所について、リテラルの先頭と末尾は不可、記号の前後は不可
2-7
varによる変数宣言はローカル変数を宣言するときにしか使用できない
2-19
nullに文字列を連結できる
3-3
byteは-128~127まで扱える
3-6
||や&&を使う際は左オペラントから実行され、実行不要の際は実行されない
3-10
equalsのオーバーロードに気を付ける
3-13
Stringのequalsは同値性を確かめるものになっている
3-14
internはコンスタントプール内の参照を返す
3-19
long, double, float, boolean型はswitch文で条件式を戻す型として使えない
3-20
case値は、条件式が戻す型に互換性がないものは使用できない、変数は使用できない
3-21
switch文では、breakされない限りdefault文も実行される
4-3
do-while文で中カッコを省略したらdoの後には1行のみしか記載不可
4-4
for文の一時変数には同じ型の変数しか初期化できない
4-16
ラベルはどこでも使える
5-1
中身0の配列も作成できる
5-2
配列宣言の際、変数の後ろに大カッコを付けることができる
5-7
初期化子を記述した際は大カッコに数字は記述しない
6-4
ガベージコレクションは参照しているインスタンスが無くなった際にインスタンスを削除する機能、nullを入れることで削除
6-16
オーバーロードは引数を変えるだけ
6-17
double, intだけなどのあいまいなオーバーロードは実行時エラーになる
6-18
アクセス修飾子だけ違っていてもオーバーロードはされない
6-19
コンストラクタのアクセス修飾子はなんでも可能
6-20
クラス名と同じメソッドの作成はできる、戻り値があるとコンストラクタにはならない
6-21
初期化子はコンストラクタ前に実行される
6-25
別のコンストラクタを実行する際は最初に記述する
7-4
デフォルトメソッドは実装しなくでもよい
7-6
スーパークラスのデフォルトメソッドを呼び出すには「インターフェース名.super.メソッド名」
7-7
同じシグニチャのデフォルトメソッドを使うにはインターフェース名を指定する
7-9
抽象クラスで呼び出したメソッドは実装されたサブクラスのメソッドを呼び出す
7-10
オーバーライドは共変戻り値があり、同じ型やサブクラスであれば違う戻り値でもオーバーライド可能
7-12
継承関係にあるクラスで同名のフィールドがあった際、変数の型で宣言されたフィールドを使用する
7-13
インターフェースをimplementしたクラスAは、継承先のクラスB(インターフェースのimplement無)でインターフェースの実装をしていたら、クラスAは実装されているとみなされる
7-14
thisはそのクラス自身を表す
8-1
ラムダ式は(型 引数名)、(引数名)どちらでも可
8-2
中カッコがある場合は、複数の処理を記載できreturn文が必要、中カッコが無い場合は1行のみ記載でき、return文は記載できない
8-4
ラムダ式内で使用する変数は実質的にfinalの変数でないといけない
9-5
Calendarより便利になったものがLocalDate
9-6
LocalDateは値の変更ができない、値を変更すると新しいインスタンスが返される
9-7
ArrayListはnullと重複を許容し、スレッドセーフ(遅くても安全に並列処理ができる)ではないコレクション
9-9
ArrayListのaddはインデックスを使って追加する箇所を指定できる
9-11
ArrayListのremoveはequalsがtrueを戻す若いインデックスのものが削除される、インデックスの指定のみでも可
9-12
拡張for文中に要素を削除した時の動きに気を付ける
9-14
ArraysListは動的配列、List.ofやArrays.asListから作るリストは固定長
10-6
finalyブロックのreturnが戻される
10-7
returnで戻す値は専用の変数が用意されるイメージ
10-11
Throwable ←Error
←Exception ←RuntimeException(非検査例外)
10-12
エラーの例外処理を記述することは可能
12-9
クラスの依存関係を調べるには「jdeps」,モジュールの依存関係を調べるには「java –show-module-resolution」
12-13
switch文ではハッシュコードを調べるため、nullを渡すと例外が発生する
12-15
javaコマンドの-cpはクラスパスの指定
12-17
クラス変数はstaticを付けたフィールドに宣言した変数、インスタンス変数はstaticをつけずにフィールドに宣言した変数
12-32
abstractクラスで抽象クラスを作るにはabstractで修飾する必要がある
12-38
Listのofメソッドは変更不可のコレクションを作成する
12-44
引数つきコンストラクタを作成したら、デフォルトコンストラクタが作成されないため、サブクラスを作成する際は気を付ける
12-52
roundメソッドは四捨五入するためのメソッド
12-57
catchブロックの例外クラスは継承関係のものを使う際、サブクラスを前に持ってくる
12-63
初期化されていないローカル変数を使うとコンパイルエラー
13-20
配列にデフォルト値は存在する
13-29
finalで修飾された変数はコンストラクタ等で初期化されないといけない
13-32
オーバーライドをする際は、戻り値をサブクラスに変更することができる
13-33
Object型は参照を扱う
13-37
ローカル変数は初期化をしないと参照することができない、フィールドは初期化の必要無し
13-45
抽象クラスでは抽象メソッドと具象メソッドの二つを定義でき、前者はabstractで修飾されるかつ{}無、後者はabstract無で{}有
13-50
public→protected→デフォルト→privateの順に厳しくなっていく