「スッキリわかるJava入門 第3版 スッキリわかるシリーズ」を読んだので内容をまとめる

<a href="https://www.amazon.co.jp/%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8BJava%E5%85%A5%E9%96%80-%E5%AE%9F%E8%B7%B5%E7%B7%A8-%E7%AC%AC3%E7%89%88-%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8B%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E4%B8%AD%E5%B1%B1/dp/429501124X/ref=asc_df_429501124X/?tag=jpgo-22&linkCode=df0&hvadid=342653193298&hvpos=&hvnetw=g&hvrand=3320609463356673773&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1028853&hvtargid=pla-1184924992542&psc=1&mcid=7b4ad4db20513279a53156def58d4c72&th=1&psc=1">「スッキリわかるJava入門 第3版 スッキリわかるシリーズ」</a>を読んだので、その内容を簡単にまとめてみました。
この本はJavaに触れたことのない人でもかなりわかりやすく解説されており、Javaの基礎を体系的に学べるのでJava初学者には非常におすすめの１冊です。

800ページ近くあるので要点のみ見返すことができるようにまとめているので、各用語の詳しい解説は記載していません。


## 第1章 プログラムの書き方

### 開発の流れ
①ソースコードの作成・・・拡張子は.javaとする決まり
②コンパイル・・・ソースファイルをクラスファイルに変換する
③実行・・・インタプリタが内部にJVM（Java Virtual Machine）という仕組みを持ち、CPUに送って処理を実行させる

### 変数宣言
・変数は変数名と型を宣言して利用するルール
・予約語は使用できない
・大文字・小文字・全角・半角は区別される
・代表的なデータ型は以下9種類あり、用途に合わせて使い分ける
　　byte, short, int, long, float, double, boolean, char, String
・finalをつけて変数を宣言すると定数となり、値の書き換えができない


## 第2章 式と演算子
### 式
・ソースコードに記述されつ具体的な値をリテラルと呼ぶ
・各リテラルはデータ型を持ち、表記方法によって決まる
・式は演算子とオペランドで構成
・演算子が評価されるとその演算子とオペランドは結界に化ける
・演算子は優先順位と結合規則に従って評価される

### 型変換
・大きい変数に小さいデータを代入する際、自動的に型が変換され代入される
・小さい変数に大きいデータを代入する際、キャストすることで代入できるが情報の欠損が発生する
例）
・式が評価される際、大きいデータに揃えるように自動的に型変換が行われる


## 第3章 条件分岐と繰り返し
### 構文
・分岐と繰り返しは条件式とブロックで構成される
・文字列を比較するときは==ではなくequalsを使用する
・ブロック内で定義した変数はブロック終了とともに消滅する

### 分岐
・ifまたはswitch文を使用する
・if文は「if-else」「ifのみ」「if-else if-else」の３種類
・switch文のブロックはbreakで抜けることができる

### 繰り返し
・while、do-while、for文を使用する
・while文のブロックは最低0回以上、do-whileぶんのブロックは最低1回以上実行される
・break文を実行すると繰り返し自体を中断し、continue文を実行すると繰り返しの次のループへ進める


## 第4章 配列
### 配列の基本
・配列の利用には、配列変数の宣言と要素の作成の２段階での準備が必要
・配列変数の型には要素の型[]を指定する
・要素を作成するには new 要素の型[要素数] とし、配列変数に代入
・配列変数名[添え字]でそれぞれの要素を読み書きする
・for文や拡張for文を用いて配列要素にアクセスする

### 配列と参照
・配列変数は、newで確保された各要素のメモリ（配列の実体）を参照する
・特別な値nullが代入された配列変数は、どの実体も参照しない
・参照されなくなったメモリ領域は、ガベージコレクションによって自動的に解放される


## 第5章 メソッド
### メソッドの基本
・メソッドの呼び出しに引数として値を渡す
・メソッド呼び出し時に渡す値を実引数、受け取る側の変数を仮引数という
・メソッド内で宣言した変数をローカル変数といい、他のメソッドから使用不可
・ローカル変数はメソッドの実行が終わると消滅する
・戻り値にはreturn文を使用する
・戻す値の型はメソッドの定義で宣言する必要がある
・戻り値を受け取るには代入演算子＝を使用する

### メソッドの活用
・オーバーロードとは、仮引数の数と値が異なる同じ名前のメソッドを定義することである
・配列を渡すとき、あるいは戻すときに配列そのものではなく配列のアドレスを渡しており、このことを参照渡しという
・コマンドライン引数を利用すれば追加情報を指定して処理を実行させることができる


## 第6章 複数クラスを用いた開発
### クラスの分割
・別のクラスを呼び出す際は「クラス名.メソッド名」と指定する
・１プログラムは複数クラスファイルの集合体

### パッケージ
・package文を用いてクラスをパッケージに所属させる
・import文を用いるとコード中のFQCN指定を省略できる

### API
・Javaでもともと用意されているクラス
・java.やjavax.で始まるパッケージ名を用いる
・java.langに属するクラスは自動的にインポートされる
・APIリファレンスで詳細を調べることができる


## 第7章 オブジェクト指向をはじめよう
### オブジェクト指向の概要と本質
・ソフトウェアを開発する際に用いる部品化の考え方


## 第8章 インスタンスとクラス
### インスタンスとクラス
・金型ではなくその型から生み出された仮想世界で活動する実体がインスタンス
・インスタンスを生み出すための金型がクラス
・クラスからインスタンスを生み出すにはnew演算子を使う
・オブジェクトという言葉は曖昧なもの
・クラス型の変数には、そのクラスから生み出されたインスタンスを格納でき、利用するには以下のようにアクセスできる
　　変数名.フィールド名
　　変数名.メソッド名()



### フィールドとメソッド
・クラスは、フィールドという属性・操作するためのメソッドを宣言する
・finalをつけると定数フィールドとなるため、値が書き換えられなくなる
・thisは自分自身のインスタンスを表す



## 第9章 さまざまなクラス機構
### クラス型と参照
・クラス型変数にはインスタンスの情報が格納されているメモリの先頭番地が入っているので、インスタンスそのものが入っているわけではない
・クラス型は配列型と同様に参照型である
・クラス型変数を別の変数に代入した場合は、番地情報だけがコピーされるので、インスタンスそのものが代入されるわけではない

### コンストラクタ
・インスタンスが生まれた直後(newされた直後)に自動実行されるメソッド
・newされると初期化で設定した値が代入される
・コンストラクタはインスタンス生成時に自動的にJVMが実行するもので、開発者が直接呼び出す手段はなし
・以下条件を満たすメソッドはコンストラクタとみなされ、自動実行されるきまりとなっている
　　　・メソッド名とクラス名が完全に等しい
　　　・メソッド宣言時に戻り値の方が記述されていない（voidもだめ）
・オーバーロードによってコンストラクタは複数定義できる
・クラス内にコンストラクタが１つもない場合はデフォルトコンストラクタ（引数なし・処理内容なしで何もしない）が自動的に定義される仕組み
・this()は同じクラス内の別コンストラクタの呼び出しができる


## 第10章 継承
### 継承の基本
・継承にはextendsを使う
・親クラスのメンバは子クラスに自動的に引き継がれるので、差分のみを子クラスに記述する
・親クラスにて宣言されているメソッドを子クラスにて上書きするとオーバーロードとなる
・finalが付いたクラスやメソッドは継承・オーバーロードができない
・子クラス is-a 親クラス（=子クラスは親クラスの一種である）に当てはめられるのが正しい継承である
・継承にはクラスの特化・汎化の関係を持つ
・継承関係を表す図を継承ツリーといい、下から上に向かって特化→汎化となる

### 継承についてより詳しく
・継承されたクラスのインスタンスは、親クラスのインスタンスを内部に持つので、外側のインスタンス部分のメソッドが優先される
・外側のインスタンス部分に属するメソッドが、１つ内側のインスタンスのメンバにアクセスした場合は、superを用いる
・コンストラクタについて、JVMは自動的に一番外側のインスタンスのコンストラクタを実行する
・全てのコンストラクタはその先頭で内部インスタンス（親クラス）のコンストラクタを呼び出さなければならず、その際にはsuper(引数)とする
・super()がなかった場合は、自動的にsuper()が追加される


## 第11章 高度な継承
### 抽象クラス
・詳細を決めることができないメソッドはabstractをつけて抽象メソッドとして定義できる
・抽象メソッドを１つでも含むクラスはabstractをつけて抽象クラスにする決まりとなっている
・抽象クラスはインスタンス化ができない
・抽象クラスのメリットは、親クラスとして抽象クラスを定義すれば、望ましくないインスタンス化やオーバーライドのし忘れを防ぐことができる

### インターフェース
・インターフェースとはざっくりいうと特に抽象度が高いクラスのこと
・以下条件を満たすものはインターフェースとして扱うことができる
　　・全てのメソッドが抽象メソッドである
    （インターフェースに宣言されたメソッドは自動的にabstractになる）
　　・フィールドを１つも持たない　（ただしfinalとstaticが付いていればOK）
・インターフェースを親にもつ子クラスの定義はimplementsを使う
・インターフェースのメリットは以下の通り
　　・同じインターフェースを継承する複数の子クラスに共通のメソッド群を実装させることができる（よってインターフェースのメソッドはpublicのみ)
　　・インターフェースが定めたメソッドは最低限持っていることが保証される
・メソッドの処理動作が決まっていないので、例外的に多重継承（複数の親クラスを持つ）が許される


## 第12章 多態性
### 多態性とは
・多態性とは、あるものをざっくり捉えることであり、それにより色々なメリットがある
・複数のインスタンスを同一視して、親クラス型の配列にまとめて扱うことができる
・呼び出す側は相手を同一視し同じように呼び出すことができるが、呼び出される側が個々のインスタンスに定義された動きをする


## 第13章 カプセル化
### カプセル化とは
・メンバに対するアクセス制御によって望ましくない値が入ることを防ぐこと
・基本的にクラス・メソッドはpublic、フィールドはprivateで就職すれば良い
・フィールドにアクセスするためにはgetter、setterメソッドを使用する
・setter内部では引数の妥当性検査を行う

### メンバのアクセス修飾
・privateを指定すると同一クラス内からのみアクセス可能
・package privateを指定すると同一パッケージないのクラスからのみアクセス可能
・メンバ宣言時にアクセス修飾子を付けなかった場合にはpackage privateになる
・publicを指定すると全てのクラスからアクセス可能

### クラスのアクセス修飾
・package　privateを指定すると同一パッケージ内のクラスからのみアクセス可能
・クラス宣言時にアクセス修飾子を付けなかった場合にはpackage privateになる
・publicを指定すると全てのクラスからアクセス可能


## 第14章 Javaを支えるクラスたち
### Objectクラス
・全てのクラスはObjectクラスの子孫となるため、全てのインスタンスはObject型の変数に代入が可能
・全てのクラスはObjectからtoString()やequals()を継承するため、自分で定義したクラスにおいてはこれらをオーバーロードする必要があるか検討しなければならない

### 等値と等価
・等値とは、同一の存在であること。つまり、同じアドレスを指していることとなり、「==」を判定に使う
・等価とは、同じ内容であること。つまり、同じアドレスを指していなくてもOKで、「equals()」を判定に使う
・Srting型は参照型なので、判定にはequals()を使う

### 静的メンバ
・メンバにstaticを付けて宣言すると静的メンバとなる
・自分で静的メンバを定義するというよりかは、JavaAPIを通じて利用するイメージ
・JavaAPIに備わっている静的メンバには以下のようなメリットがある
　　・newしなくても手軽に呼び出すことができる
　　・newではなく静的メソッドを使ってインスタンスを生成できる
・静的メンバへのアクセスにはクラス名・インスタンス名のどちらからでも可能


## 第15章 文字列と日付の扱い
### 文字列操作
・文字列の操作はStringクラスに備わっている様々なメソッドを通じて行う
・文字列の連結にはStringBuilderを使い、＋演算子は使わない

### 日付と時間の扱い
・日付情報はjava.util.Date型で扱う
・年月日時分秒のint値からDateインスタンスを生成するにはCalendarクラスを用いる
・Dateインスタンスの内容を文字列に整形する際は、SimpleDateFormatクラスを用いる

### 日付と時間の扱い
・Java8からはTImeAPIを用いて日付や時間を扱う
・TimeAPIではnewによるインスタンス化が禁止されているため、静的メソッドであるnow()やof()を用いる
・Instantクラス・ZonedDateTimeクラスは、厳密な日時情報を格納する際に使う
・LocalDateTimeクラスは、日常的に利用する日時情報を格納する際に使う
・Durationクラス・Periodクラスは、時間の間隔を格納する際に使う


## 第16章 コレクション 
### コレクションの基本
・主にList・Set・Mapの３種類で、以下の特性がある
　・List・・・順序通りに並べて格納、中身の重複OK、ArrayList・LinkedList
　・Set・・・順序があるとは限らない、中身の重複NG、HashSet・LinkedHaseSet・TreeSet
　・Map・・・ペアで対応つけて格納、HashMap・LinkedHashMap・TreeMap
・コレクションには基本データ型の情報を格納できないため、各基本データ型に対応するラッパークラスを使用する
・コレクションに格納可能な要素数は必要に応じて自動的に増加する
・要素を１つずつ取り出すにはイテレータを使用する


## 第17章 例外
### エラー
・文法エラー、実行時エラー、論理エラーの３種類がある
・例外処理を行うと実行時エラーに対処できる

### 例外の種類
・APIとして数多くの例外クラスがあらかじめ用意されている
・例外クラスはError系、Exception系、RuntimeException系に分類できる
・独自の例外クラスを定義したい場合は、例外クラスを継承する

### 例外処理
・try-catch文を用いて、tryブロック内で例外発生時にcatchブロック内の処理を実行させることができる
・Exception系の例外が発生するであろう場合は、try-catch文の記述は必須である
・try-with-resources文は後片付け処理の記述が不要となる