入門編

共通
・NULLがnull
 
第1章
ソースコード 人が読める状態のプログラム
・ソースファイル ソースコードを書き込んだファイルのこと、ファイル名の拡張子は「.java」とする
・クラスファイル ソースコードコンパイルして変換したもの、拡張子は「.class」となる
バイトコード ソースコードの各命令をコンピュータが実行しやすいように変換してクラスファイルに詰まっている
・定数の宣言 final 型 定数名 = 初期値; 一般的に定数名はすべて大文字
基本データ型
boolean true or false
char 16ビットUnicode文字 \u0000~\uFFFF
byte 8ビット整数 -128~127
short 16ビット整数 -32,768~32,767
int 32ビット整数 -2,147,483,648~2,147,483,647
long 64ビット整数 -9,223,372,036,854,775,808~9,223,372,036,854,775,807
float 32ビット単精度浮動小数点数
double 64ビット倍精度浮動小数点数
 
第2章
・すべての式は、オペランド演算子のみで構成される
・大きな型を小さな型に代入しようとするとコンパイルは失敗する、小さな型を大きな型に代入しようとすると暗黙の型変換が行われる。byte型やshort型へint型の代入は実害のない範囲で限定的に可能。
・引数はパラメータともいう。
・Math.max(①, ②) 2つの値を比較して大きい方を返す
・Integer.parseInt(①) 文字列①を数値に変換して返す
・new java.util.Random().nextInt(①) 0~(①-1)の乱数を生成して返す
・new java.util.Scanner(System.in).nextLine() キーボードから1行の文字列の入力を受け付ける
・new java.util.Scanner(System.in).nextInt() キーボードから1つの整数を入力を受け付ける
・import java.util.*でインポートしてScanner sc = new Scanner(System.in); int a = sc.nextInt(); String s = sc.nextLine();で読み込んだりする
 
第3章
javaは条件判定ではC言語のようにゼロか非ゼロかではなく、trueかFalseでしか見ていない。比較演算子が真ならtrue、偽ならfalseがboolea型で返される
・文字列型の変数.equals(比較相手の文字列の変数名) 等しい内容であればtrue
 
第4章(配列)
・new演算子
・配列の変数名.length 配列の要素数を返す
・配列は自動的に初期化される intやdoubleなどの数値の型は0、boolean型はfalse、String型はnullで初期化
・配列作成と初期化の省略記法 ①要素の型 配列変数名 = new 要素の型 {}; ②要素の型 配列変数名 = {};
・範囲外要素の利用 コンパイルには成功するがArrayIndexOutOfBoundExceptionというエラーメッセージが表示される
・拡張for文 for (要素の型 任意の変数名 : 配列変数名)
・int scoresで宣言されるscoresは配列"変数"名である定数ではないのでアドレスを代入すると切り替えることができる
・配列変数scoresは「配列の実体は(例)8832番地にあります」と指し示す動作をする、これを参照という
・メモリ上の番地を代入する変数のことを参照型(reference type)変数という
・byte,short,int,long,float,double,char,booleanは基本型(primitive types)変数といい、参照型の変数とは区別する
・配列の後片づけ newで確保された要素はブロックが終了しても寿命は迎えない(メモリには存在するが参照できない)そのようなごみの後片づけをガベージコレクションといい自動で行われる
・nullを代入すると「参照を切る」扱い
・nullが格納されている配列変数の利用 NullPoinerExceptionというエラーメッセージが表示される
・配列のlengthは要素数、文字列のlength()は文字数を返す
・二次元配列の宣言 要素の型 配列変数名 = new 要素の型[行数][列数]
 
第5章(メソッド)
オーバーロード(多重定義) 仮引数の個数か型が異なれば同じ名前のメソッドを複数定義できる
基本型の変数をメソッド呼び出しで渡すと(値渡し)
・呼び出し元の変数の"内容"が呼び出し先の引数にコピーされる
・呼び出し先で引数の内容を書き換えても呼び出し元の変数は変化しない
配列をメソッド呼び出しで渡すと(参照渡し)
・呼び出し元の配列の"アドレス"が呼び出し先の引数にコピーされる
・呼び出し先で配列の実体を書き換えると呼び出し元にも影響する
・戻り値を配列で返すこともできるアドレスを返す
コマンドライン引数 mainメソッドの引数である配列変数argsに格納される
 
第6章(複数クラスを用いた開発)
・部品化 一つのプログラムを複数の部品に分けること
・JAR(Java ARchive)ファイル 複数のクラスファイルを1つにまとめるファイル形式
・package 所属させたいパッケージ名; クラスをパッケージに所属させる
・パッケージに親子関係や階層関係はない
・デフォルトパッケージ package文がなくどのパッケージにも所属していないことを「無名パッケージに属している」または「デフォルトパッケージに属している」という 
・完全限定クラス名(完全修飾クラス名)(FQCN(full qualified class name)) パッケージ名.クラス名 あるクラスから別パッケージのクラスを利用する場合パッケージ名を頭に付けた完全なクラス名を使う必要がある
・import パッケージ名.クラス名; FQCN入力の手間を省くための宣言
・import宣言はあくまでも入力軽減機能 javaでは一切の宣言をすることなくJVMが扱えるすべてのクラスを常時使うことができる。includeのように機能が増える意味ではない
・クラスローダ 完全限定名を指定されたらその名前を持つクラスのクラスファイルをPC内から検索しJVMに読み込んで利用可能にする
・クラスパス クラスローダがクラスファイルを探す際に、見に行くべきフォルダの場所
・クラスパスの指定方法 ①起動時にjavaコマンドで指定する ②検索場所をOSに登録しておく ③特に指定しない(javaコマンドが実行されたフォルダがクラスパスになる)
・クラスパスが指定できる対象 ①フォルダの場所 ②クラスファイルが入ったJARファイルやZIPファイル ③複数のフォルダ、JAR/ZIPファイル、それらの組み合わせ
・ パッケージ階層 現在のクラスパスを基準としてパッケージ階層に対応したフォルダ階層を作り、その中に必要なクラスファイルを配置しておく必要がある(コンパイルしたらそこにクラスファイルが生成された気がする)
・javacとjavaの引数 javacコマンドはどのソースファイルをコンパイルするからファイル名を指定して実行する、javaコマンドはどのクラスのmainメソッドを起動するかクラス目(FQCN)で指定して実行する
名前空間 パッケージ名さえ異なればクラス名は重複してもよい
・パッケージ名が衝突するとその前提は崩れるので自社が保有するインターネットドメインを前後逆順にしたものから始まるパッケージ名を用いることを推奨
API(Application Programming Interface)開発を行うために用意された便利な機能(標準APIJavaで開発するときは、すべてを1から実装するのではなく、標準で用意されているAPIを使う
java.util.Arrays.sort(①) 配列①を並べ替える
Java APIに含まれる代表的なパッケージ
java.lang | javaに欠かせない重要なクラス群
java.util | プログラミングを便利にするさまざまなクラス群
java.math | 数学に関するクラス群
java.net   | ネットワーク通信などを行うためのクラス群
java.io     | ファイル読み書きなどデータを逐次処理するためのクラス群
java.langパッケージに属するクラスは頻繁に利用するものが多いのでimport文を記述しなくても自動的にインポートされる 代表的なクラスSystem,integer,Math,Object,String,Runtime
・クラスロードは必要な時に必要なものだけ 起動するたびに3500以上のAPIクラスをロードしているわけではない
 
・プログラムが長すぎると人間の頭が追いつかないため人間自身がプログラム開発のボトルネックになってしまっている
オブジェクト指向プログラミング(Object Oriented Programming = OOP)
オブジェクト指向とは ソフトウェア開発をするときに用いる部品化の考えた方のこと
・賢い部品化を行うと ①人間が内容を把握しやすいプログラム開発を実現する ②プログラムの変更が容易になる(柔軟性・保守性の向上) ③プログラムの一部を簡単に転用できる(再利用性の向上)
オブジェクト指向による部品化のルール 現実世界に出てくる登場人物の単位で、プログラムをクラスに分割する。Java仮想世界に仮想的な登場人物のオブジェクトとして生み出される
・私たち人間が慣れ親しみ、よく把握している現実世界を真似して作られたプログラムもまた、私たち人間にとって把握しやすいもの 現実世界の登場人物とそのふるまいをコンピュータ内の仮想世界で再現
・開発者はそれぞれの部品(クラス)に責務をプログラムとして書き込む
・オブジェクトは 行動責任(操作) 情報保持(属性) を持つ
・継承 過去に作った部品を流用し、新しい部品を簡単に作れる機能
多態性 似ている2つの部品を同じようなものと見なし、いいかげんに利用できる機能。違いを気にせず同じ操作で扱える
カプセル化 属性や操作を一部の相手からは利用禁止にする機能 
 
第8章(クラスとインスタンス)
・クラス オブジェクトが生み出される際に用いられる設計図(金型)。手順①クラスを定義する ②そのクラスに基づいてオブジェクトを生成する
・オブジェクトという用語のあいまいさ この用語は時々クラスのことを指して使われることもある、かなりあいまいなもの
インスタンス 設計図(金型)ではなく、その型から生み出された仮想世界で活動する実態ということを厳密に示したい場合はインスタンスという用語を用いて、クラスからインスタンスを生成する行為をインスタンス化と表現することもある
・クラスとインスタンスの関係 仮想世界で活動するのはインスタンスであり、そのインスタンスを生み出すための設計図(金型)がクラスである
Javaプログラムの組成に必要なクラス ①mainメソッドを含む、1つの「神様のクラス」 ②現実世界の登場人物を模した、複数の「登場人物クラス」
・クラス図(class diagram) あるクラスの設計内容を上から「クラス名」「属性」「操作」の一覧として並べる書き方。世界共通の設計図として定義されたUML(Unified Modeling Language)で定められている図の一つ
・クラスブロック内に宣言された数をjavaでは特にフィールドという、フィールドの宣言の先頭にfinalを付けると値を書き換えることができない定数フィールドになる(見やすいようにすべて大文字が推奨)
・this 自分自身のインスタンスを意味する(省略しても動作するがローカル変数や引数にも同じ名前の変数があると予想外の動作になる可能性があるので明確に区別するため忘れないよう記述する)
・メンバ(member) フィールドとメソッドの総称
クラス名       | 名刺 |単語の頭が大文字 
フィールド名  | 名刺 | 最初以外の単語の頭が大文字
メソッド名  | 動詞 | 最初以外の単語の頭が大文字
・クラス定義に可能になること ①そのクラスに基づいてインタンスを生成できる ②そのクラスから生まれたインスタンスを入れる変数の型が利用できるようになる
・クラス型 クラスを定義することで利用可能になる型のこと
インスタンスの生成→ クラス名 変数名 = new クラス名();
インスタンスのフィールド利用→ 変数名.フィールド名 = 値;
インスタンスのメソッド利用→変数名.メソッド名();
・非オブジェクト指向のクラスとの違い 現実世界の人や物、出来事をクラスに置き換えていく「オブジェクト指向」という明確な思想に基づいているか否か
 
第9章(クラス機構)
JVMが用意するメモリ領域のことをヒープ(heap)
インスタンスはヒープの中に確保されたメモリ領域に過ぎない
・参照の代入 newによって生成されるインスタンスのために確保されたメモリの先頭番地が返されて代入
・クラス型と配列型は総称して参照型
・まずクラス変数から番地情報を取り出して、その番地にアクセスするというJVMの動作を参照の解決やアドレス解決という
インスタンスの独立性 同じクラスから生まれても異なるインスタンスであれば互いに影響を受けないこと
・has-aの関係 あるクラスが別のクラスをフィールドとして利用している関係
・アロー演算子にあたるものはない
・String型はクラス型 java.langパッケージに宣言されている、二重引用符で文字列を囲めばインスタンスを生成して利用できる
・(例)String s = new String("こんにちは")ともできるが効率が悪いので通常は利用しない
・コンストラクインスタンスが生まれた直後に自動実行される処理をあらかじめ定義できる、JVMが自動実行するので開発者が直接呼び出すものではない
・コンストラクタとみなされる条件 ①メソッド名がクラス名と完全に等しい ②メソッド宣言に戻り値の型が記述されていない(voidもダメ)
・コンストラクタは引数を受け取れる newするときにコンストラクタに渡すべき引数を指定する
・コンストラクタのオーバーロード 複数のコンストラクタが定義されていた場合、newするときに渡した引数の型・数・順番に一致するコンストラクタが動作する(動作するコンストラクタは1つのみ)
・暗黙のコンストラクタ クラスに1つもコンストラクタが定義されていない場合に限って、「引数無し、処理内容無し」のコンストラクタ(デフォルトコンストラクタ)がコンパイル時に自動的に追加される
・this(引数); 同一クラス内の別コンストラクタの呼び出しをJVMに依頼する 
 
 
第10章(継承)
・継承を用いたクラスの定義
public class クラス名 extends 継承元のクラス名で宣言。
継承元のクラスの差分だけ記述して新たなクラスをつくれる。
・多重継承は禁止
・親クラスから継承したメソッドを子クラスで上書きすることをオーバーライド
親クラスに同じメンバが無ければそのメンバは追加扱いで、同じメンバが有ればそのメンバは上書き扱い。
・宣言時にfinalが付けられているクラスは継承できない、宣言時にfinalが付けられているメソッドは子クラスでオーバーライドできない
・同名のフィールドを宣言してオーバーライドすると意図しない動作になることが多いので非推奨。
・継承すると子と親の二重構造になる。
super.フィールド名で親インスタンス部分のフィールドを利用
super.メソッド名()で親インスタンス部分のメソッドを呼び出す
super()親コンストラクタ呼び出し
三重構造で親の親のインスタンス部分へ直接アクセスはできない
・すべてのコンストラクタはまず親クラスのコンストラクタから呼び出さなければならない。
コンストラクタの先頭にsuper();が無ければ暗黙的にsuper();が追加される。
コンストラクタは各クラス固有のものであり継承はされない。
 
 
第11章(抽象クラス・インタフェース)
未来に備えてクラスを事前に用意する
・public abstract 戻り値の型 メソッド名()で詳細未定の抽象メソッドを宣言。何もしないメソッドと現時点では何をするか確定できないメソッドを区別。オーバーライドを強制する。
・public abstract class クラス名で未完成部分を含む継承専用クラスを誤ってnewされることを防ぐ。抽象メソッドを含むクラスは必ずabstract付のクラスにしなければならない。
・すべての抽象メソッドを実装しなければクラス宣言からabstractを外すことはできずnew利用はできない
・インターフェースとして特別扱いできる条件①すべてのメソッドは抽象メソッドである。②基本的にフィールドを1つも持たない(public static finalが付いたフィールド定数だけが許されるのと省略しても補われる)
・public interface インタフェース名で宣言。メソッドは自動的にpublicかつabstractになる
・インタフェースは接点のイメージ
・public class クラス名 implements インタフェース名で実装
・インタフェース効果は共通のメソッド群の実装を強制できる
・public class クラス名 implements 親イ1,親イ2でメソッドの詳細を定めていないことにより重複するメソッドの衝突が起きないので多重継承が許される
・子インタフェースが親インタフェースの継承をして抽象メソッドの追加もできるimplements(実装)ではないのでextends(拡張)
・継承元      | 継承先        | キーワード         | 継承元の数
クラス           | クラス           | extends    | 1つ
インタフェース | クラス           | implements | 1つ以上
インタフェース | インタフェース | extends    | 1つ以上
・extendsとimplementsの同時使用
public class クラス名 extends 親クラス implements 親インタフェース名
・デフォルト実装付き抽象メソッドの宣言
default 戻り値の型 メソッド() {処理のデフォルト実装}
オーバーライドされなかったら自動的にデフォルト内容をオーバーライドするがデフォルトの衝突もあり得る。
 
第12章(多態性)
子と親を一緒にざっくり捉える。イメージして矛盾しないなら代入は許される。
is-a(特化・汎化)関係であればよい。
・捉え方を途中で変えるダウンキャストp477
不正な代入が行われたらClassCastExceptionが発生
instanceof演算子(変数 instanceof 型名)で大丈夫ならtrue
・ざっくり捉えてまとめて扱う
配列等で異なるインスタンスをまとめて扱える
・メソッドの動作は中身の型に従う
親クラスに代入すると子クラスのみにあるmethodは呼び出せない。
javaは中身が親の型なので中身が子だと判別できないから。
親のmethodを呼び出すとそれを子のmethodでオーバーライドしていたら
同じmethodでそれぞれのやり方を呼び出せる。
 
第13章(カプセル化)
・好き勝手に上書きされてしまうとバグになるものは外部から設定を制限するように隠す
・隠すことで名称指定せずにアクセスするので名称を変えても変更しなくてよい
・アクセス制御の 名称|指定方法|範囲 (矢印は制限の厳しさ)
↑private | private | 自分自身のクラスのみ
|package private | (何も書かない) | 自分と同じパッケージに属するクラス
|protected | protected | 自分と同じパッケージに属するか自分を継承した子クラス
↓public | public | すべてのクラス
・クラスとメソッドはpublic,フィールドはprivateが基本
privateでフィールドを隠してmethod経由でアクセスする。ReadOnlyにもできる。フィールドは変化していくので異常値になるとバグの元で矛盾を起こさないようにする。methodは定義した後変わらない。アクセスするmethodはgetter,setterなど。setter内部では妥当性検査を行い安全なクラスを目指す。
・非publicクラス、publicクラスの特徴
クラスの名前はソースファイル名と異なってもよい。1つのソースファイルにクラスを複数宣言してもよい。
1つのファイルに1つのpublicクラス、ファイル名=publicクラス。
 
・同一クラス内のフィールド設定も直接代入ではなくsetterを用いるとsetterの不正値チェックを利用できるので推奨
・getter/setterの増減のイディオム
int n = h.getHp(); // int n = h.hp;
h.setHp(10); // h.hp = 10;
h.setHp(h.getHp() + 5); //h.hp += 5;
 
第14章(Javaを支えるクラス)
・暗黙の継承
あるクラスを定義するときextendsで親クラスを指定しなければjava.lang.Objectを継承したとみなされる。
・全クラスの祖先Objectクラス
すべての子がObject型の箱に代入できる。is-a関係が常に成り立つ。
equals()あるインスタンスと自分自身が同じかを調べる。
toString()自分自身の内容の文字列表現を返す
・System.out.printlnはtoString()を利用して文字列表現を得ている
なのでtoString()をオーバーライドすると引数の(変数名)と(変数名.toString())の実行結果は同じになる
・等値と等価
等値は指している物ものが完全に同一の存在つまり同じアドレスを指す。等価は指している2つのものが同じ内容であることつまり同じアドレスを指していなくてもよい。何を持って等価とみなすかは一律には決められないので定義しなおす必要性を検討する(クラスを開発したらtoString()とequals()のオーバーライドの必要性を検討)
・静的メンバ(静的フィールド)
static 型 変数名で宣言。フィールド変数の実体がクラスに準備される。
クラス名.静的フィールド名でアクセス(変数それぞれに用意されてはいない。クラスで1つ)、ただ変数名.静的フィールド名で代入してもクラス名.静的フィールド名と同じ扱いになる。インスタンスを1つもnewしなくても利用可能。静的フィールドはクラス(金型)にフィールド(箱)が所属する特徴からクラス変数とも呼ぶ。
・静的メンバ(静的メソッド)
static 型 メソッドで宣言。メソッド自体がクラスに所属しインスタンスにもメソッドの分身が準備される。
静的フィールド同様、クラス名.メソッド名()やインタンス変数名.メソッド名()で呼び出せる(インスタンスを1つも生成しなくても)。
・mainメソッドにstaticがなぜ必要か
mainメソッドが最初に呼び出される時には1つもインスタンスが存在していないから
・静的メソッドから非静的メンバの利用は不可
静的メソッドは1つもインスタンスが生成されていない時に呼び出されることもあるので、そんなときに生成された後であることが前提の非静的メンバを上手く処理できない
・静的メンバのメリット
newせずに手軽に呼び出せる(JavaAPIを通して利用する可能性がある )。
 
 
 
第15章(文字列と日付の扱い)
文字列を調査する
・public boolean equals(Object o)内容が等しいか調べる
・public boolean equalsIgnoreCase(String s)大文字、小文字を区別せず内容が等しいか調べる
・public int length()文字列長を調べる(全角も半角も1文字扱い)
・public boolean isEmpty()空文字か長さが0かを調べる
文字列を検索する
・public boolean contains(String s)一部に文字列sを含むか調べる
・public boolean startsWith(String s)文字列sで始まるか調べる
・public boolean endsWith(String s)文字列sで終わるかを調べる
・public int indexOf(int chまたはString str)文字chまたは文字列strが最初に登場する位置を調べる
・public int lastIndexOf(int chまたはString str)文字列chまたは文字列strを後ろから検索して最初に登場する位置を調べる
文字列を切り出す
・public char charAt(int index)指定位置の1文字を切り出す
・public String substring(int indexまたはint index, int endIndex)指定位置から始まる文字列を任意の長さだけ切り出す(endIndexの添え字は含まない)
・public String toLowerCase()大文字を小文字に変換する
・public String toUpperCase()小文字を大文字に変換する
・public String trim()前後の空白を除去する(全角スペースは削除されない)
・public String replace(String before, String after)文字列を置き換える
StringBuilderを用いた連結
・StringBuilderをnewする、appendメソッドを呼び出してバッファに文字列を追加して最後に1回toString()を呼んでStringクラスに代入
・Stringインスタンスの不変性。Stringインスタンスの持つ文字列情報はインスタンス化した際に初期化されて二度と変わらない。+演算子など連結した際は旧情報が破棄されてnewされる。
String・char配列・byte配列の相互変換
・char配列は1文字ずつ処理したい、byteは文字コードで処理したい
・toCharArray()charの配列に変換
・getBytes("utf-8")
・getBytes()デフォルト文字コードを利用
・new String(charの変数名とかbyteの変数名)char配列やbyte配列をStringインスタンスに変換
文字列がパターンに従った形式を満たしているかを照合する処理をパターンマッチング
Stringクラスのmatchesメソッド戻り値はboolean
・通常の文字列:"ABC"なら1文字目がA,2文字目がB,3文字目がCかどうか
・ピリオド:任意の1文字であればよい、何でもよい
アスタリスク:直前の文字の0回以上の繰り返し、.*はすべての文字列を許すという慣用句的な表現
・波カッコ:指定回数の繰り返し
{n}直前の文字のn回の繰り返し
{n,}直前の文字のn回以上の繰り返し
{n,m}直前の文字のn回以上m回以下の繰り返し
?直前の文字の0回または1回の繰り返し
+直前の文字の1回以上の繰り返し
・角カッコ:いずれかの文字[LIN]ならLかIかNのどれかであれば
・角カッコ内のハイフン:[a-z]a~zのいずれか
¥dいずれかの数字[0-9]と同じ
¥w英字・数字・アンダーバー[a-zA-Z_0-9]と同じ
¥s空白文字(スペース、タブ文字、改行文字など)
・ハットとダラー:先頭と末尾^j.*p$は先頭文字がjで最後の文字がpの文字列。matcher()ではなくてもよいがsplit()やreplaceAll()で先頭や末尾を明示する必要があるときに用いる
splitメソッドで文字列の分割
・split("[,:]")ならカンマかコロンの場所で文字列の分割
replaceAllメソッドで文字列の置換
・replace("[beh]","X")ならbehのいづれかに当てはまればXに置換
日付と時刻を扱う
・long start = System.currentTimeMillies(); long end = System.currentTimeMillis();でend-startをするCのアレにそっくりだね
・Date d = new Date() 現在の日時を持つDateインスタンスの生成(java.util) d.getTime()でlong値を取得
Calendarクラスの利用
6つのint値からDateインスタンスを生成
・Calendar c  = Caledar.getInstance();c.set(年,月,日,時,分,秒)またはc.set(Calendar.~,値);Date d = c.getTime();
Dateインスタンスから6つのint値を生成する
・Calendar c = Calendar.getInstance();c.setTime(d);
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH);
int day = c.get(Calendar.DAY_OF_MONTH);
int hour = c.get(Calendar.HOUR);
int minute = c.get(Calendar.MINUTE);
int second = c.get(Calendar.SECOND);
・Calendarクラスの月の取得・設定は0~11使用する
・SimpleDateFormat f = new SimpleDateFormat(書式文字列);Date d = f.parse(文字列);StringからDateインスタンスを生成
・SimpleDateFormat f = new SimpleDateFormat(書式文字列);String s = f.format(d);DateインスタンスからStringを生成
・Tue Sep 22 01:23:45 JST 2020 のような文字列ならDateインスタンスのtoStringメソッドを呼び出すだけでok
書式文字列として利用可能な文字(一部)
文字 | 意味
y   |  年
M   | 月
d   | 日
h   | 時(0~23)
m   | 分
s   | 秒
k   | 時(0~11)
e   |曜日
a   |午前/午後
・long値とDate型の関係図p586
java.timeパッケージ
クラス名 機能と役割
・InstantとZoneDateTime 世界における、ある瞬間の時刻をナノ秒単位で厳密に指し示し保持する
・LocalDateTime 日常的に使われる曖昧な日時を保持する
・DurationとPeriod 2つの異なる時刻や日付の期間を保持する
・和暦を扱うAPI Time APIjava.time.chrono.JapaneseDateクラスだと「令和○○年○○月○○日」のように扱える
タイムゾーン(time zone) どの都市の人の基準にするかを明確にする(Asia/Tokyo, Europe/Londonなど)
・曖昧な日時の必要性 人間は普段タイムゾーン情報が欠落した曖昧な日時を使って生活している
・時刻を表すその他のクラス(p595)(java.time.Temporalインタフェースを実装しているので共通メソッド名を使うように設計されている)
・特定日時を指し示すクラスで共通に利用されるメソッド(p596)
・DurationクラスやPeriodクラスには時間の間隔を格納できる
・TimeAPIでは多くのクラスでnewが禁止されており、静的メソッドnow()やof()を用いてインスタンスを取得する
 
第16章(コレクション)
・リスト(List) 順序通りに並べて格納する(中身の重複可)
・マップ(Map) ペアで対応付けて格納する
・セット(Set) 順序があるとは限らない(中身の重複不可)
・コレクションフレームワーク(collection framework) 様々なデータ構造に対応した「テータをまとめて格納するための入れ物クラス」がjava.utilパッケージに属している
・List ArrayList, LinkedList
・Set HashSet, LinkedHashSet, TreeSet
・Map HashMap, LinkedHashMap, TreeMap
・import文の記述 java.utilパッケージに属しているので、通常import文を記述するのが一般的
・<>記号を使って格納するインスタンスの型を指定する (例)ArrayList<String> これはジェネリクスというjavaの文法の一種
・宣言時にサイズ指定は不要であり、要素は随時追加できる データを追加しようとした際に箱が不足していれば自動的に追加されていく
・コレクションにできないこと 基本データ型の情報を格納することができない
・ラッパークラス(wrapper class) 8つの基本データ型に対応して情報を中身に保持することを責務とする8つのクラスがある(例)java.lang.Integerクラスは中身にint型の数値を一つ持つだけのインスタンスを使うためのクラス
基本データ型 | ラッパークラス
byte      | java.lang.Byte
short     | java.lang.Short
int       | java.lang.Integer
long      | java.lang.Long
float     | java.lang.Float
double    | java.lang.Double
char      | java.lang.Character
boolean   | java.lang.Boolean
・オートボクシング(AutoBoxing)とオートアンボクシング(AutoUnboxing) ラッパークラス型のインスタンスと基本データ型のデータを相互に自動変換する機能
ArrayList<~> 変数名 = new ArrayList<~>(); ArrayListの宣言
操作    |  戻り値              | メソッド            | 機能 (①はインスタンスの型名)
追加    | boolean           | add(①)     | リストの最後に要素を追加
追加    | void         | add(int, ①)| リストのint番目に要素を挿入
追加    | ~                       | set(int, ①) | リストのint番目の要素を上書き
取得    | ~                       | get(int)    | int番目の要素を取り出す(添え字が0から始めることに注意)
調査    | int          | size()       | 格納されている要素数を返す(配列では.lengthだった)
調査    | boolean      | isEmpty()   | 要素数がゼロであるか判定(要素数が0かどうかの判定ならsize()より読みやすい)
調査    | boolean      | contains(①) | 指定要素が含まれているかを判定
調査    | int                    | indexOf(①) | 指定要素が何番目にあるかを検索
削除    | void       | clear()          | 要素をすべて削除する
削除    | ~                     | remove(int) | int番目の要素を削除する(削除された要素の後ろにあったすべての要素は1つずつ前に詰められる)
・ダイヤモンド演算子 newの後ろに記述する<>記号の中を省略することも可能(javaは左辺の<>の記述に基づいて右辺の中身を推測する)
イテレータ | Iterator<①> | iterator() | 要素を順に処理するイテレータを返す
イテレータ リストに含まれる1つの箱を「イマココ!」と指している矢印のようなもの
Iterator<リスト要素の型> it = リスト変数.iterator(); イテレータの取得にはnewを使わずiteratorメソッドを使う
iteratorメソッドを呼び出すとそのリストの先頭(最初の箱)よりもっと前を指した状態の矢印(イテレータ)が取得される
戻り値      | メソッド          | 機能
boolean | hasNext() | 次の要素を指せるか判定
~       | next()    | 次の要素を指し、その内容(~型)を返す
イテレータを用いたリスト要素の取り出し
iterator<リスト要素の型> it = リスト変数.iterator();
while (it.hasNext()) {
リスト要素の型 e = it.next();
/*要素eを用いた処理*/
}

・LinkedList 連結リストの構造、それぞれの箱自体はバラバラだが次の箱はどこに繋がるか連結情報を持っており数珠繋ぎの状態になっている
ArrayList         | 比較項目                   | LinkedList
配列(隙間無く並んだ箱) | 内部構造                  | 連結リスト(数珠繋ぎの箱)
遅い                                  | 要素の挿入・削除      | 早い
速い                                  | 指定値の要素の取得 | 遅い
・コレクションフレームワーク相関図(p627)(List関連とSet関連はjava.util.Collectionが共通の親だが、Mapは継承関係にない)
.Setインターフェースが備えるメソッドの一覧(p628)
・Setの基本特性 それぞれの要素には重複が許されない(重複した値を格納しようとすると無視される)・基本的に順序関係がない(なので順序関係に基づくset()やget()などはない)
・順序が保証されるSetバリエーション ①LinkedHashSet:値を格納した順序に整列 ②TreeSet:自然順序付けで整列(例)Stringなら辞書順
・マップ(Map) 2つの情報をキー(key)と値(value)のペアとして格納するデータ構造
・HashMapのインスタンス化 Map<キーの型, 値の型> マップ変数 = new HashMap<キーの型, 値の型>();
・HashMapが備えるメソッド(p634)
・Mapでは値の重複は許されるがキーの重複は許されない
・マップに格納された情報を1つずつ取り出す for (キーの型 key : マップ変数.keySet()) {値の型 value = マップ変数.get(key); /*keyとvalueを用いて何らかの処理*/}
java.util.Collections コレクション操作関連の便利なメソッド集
java.util.Arrays 配列操作関連の便利なメソッド集
・利用すべきコレクションの選び方フローチャート(p642)

第17章(例外)
・3種類の不具合 ①文法エラー(syntax error) 文法の誤りによりコンパイルに失敗 ②実行時エラー(runtime error)文法には問題ないが実行中に異常終了③論理エラー(logic error)意図しない結果になる
・各不具合に対する解決方法(p650)
・文法エラーと論理エラーは開発者の過失である、開発時にテストをしっかり行いコードを修正することで本番での発生を予防できる
・例外的状況(exceptional situation)または単に 例外(exception) 実行時エラーは「プログラムの実行中に想定外の事態が発生したことによって起こる」この想定外の状況のこと
・(例)パソコンのメモリが足りなくなった、存在すべきファイルが見つからない、nullが入っている変数を利用しようとした (これらはソースコードを作成する時点では例外的状況の発生を予防できない)
・例外処理(exception handling) 例外的状況に備えて対策を準備し、その状況に陥った際に対策を実施すること
・try-catch文 通常実行されるのはtryブロックだけで、tryブロック内を実行中に例外的状況が発生したとJVMが検知すると処理はcatchブロックに移行する、
命令を実行するたびに「例外的な状況が発生しているかどうか」をチェックする作業はJVMに任せることで開発者が負う責任は軽減される
・try {通常実行される文} catch (・・・) {例外発生時に実行される文}
・例外の種類(p658) Throwable, Error, Exception, RuntimeException
・Error系例外(java.lang.Errorの子孫) 回復の見込みがない致命的な状況(catch必要無し←しても打つ手無いから) (例)OutOfMemoryError(メモリ不足)、ClassFormatError(クラスファイルが壊れている)など
・Exception系例外(java.lang.Exceptionの子孫) その発生に十分想定して対処を考える必要がある例外的状況(catchすべき) (例)IOException(ファイルの読み書きができない)、ConnectException(ネットワークに接続できない)など
・RuntimeException系例外(java.lang.Runtimeの子孫) 必ずしも常に発生を想定すべきとまではいえない例外的状況(catchしなくてもよい←してたらきりがない)(例)NullPointerException(変数がnullである)、ArrayIndexOutOfBoundsException(配列の添え字が不正)など
・Exception系例外が発生しそうな命令を呼び出す場合、try-catch文を用いて「例外が発生したときの代替処理」を用意しないとコンパイルエラーになる
・チェック例外(checked exception) Exception系例外は、例外発生時に対策が用意されているかをコンパイルの時点でチェックされるためそう呼ばれる
・発生する例外の調べ方 メソッドやコンストラクタを呼び出した際に、Exception系の例外が発生する可能性がある場合、引数リストの後に「throws 例外クラス名」が表記される(APIリファレンスで)
・(例)IOException e 例外的状況の詳細情報が詰め込まれたIOExceptionのインスタンスをcatch文で指定された変数eに代入する
・例外インスタンスが必ず備えているメソッド
戻り値    | メソッド                          | 機能
String  | getMessage()       | 例外的状況の解説文(いわゆるエラーメッセージ)を取得 
void   | printStackTrace() | スタックトレースの内容を画面に出力する
スタックトレース JVMがプログラムのメソッドをどのような順序で呼び出し、どこで例外が発生したかという経緯が記録された情報
・2種類以上の例外をキャッチ try {} catch () {} catch () {}
・Exceptionのインスタンスをキャッチするとその子孫全てをざっくりとキャッチできる
・例外発生の如何を問わず必ず処理を実行する try {} catch () {} finally {例外があってもなくも必ず実行する処理}
・try-with-resources文 try (closeによる後片づけが必要な変数の宣言) {本来の処理} catch (例外クラス 変数名) {例外が発生した場合の処理} ※finallyを記述せずとも自動的にcloseされる ※宣言する変数はAutoCloseableを実装している必要がある
・例外の伝播 例外はキャッチされない限りメソッドの呼び出し元まで処理をたらい回しにされる
・スロー宣言による例外伝播の許可 アクセス修飾 戻り値 メソッド名(引数リスト) throws 例外クラス1,例外クラス2,・・・ {メソッドの処理内容}
・スロー宣言が及ぼす影響 影響①呼び出される側のメソッドは、メソッド内部での例外のキャッチが義務ではなくなる ②呼び出す側のメソッドは、例外を伝播してくる可能性があるメソッドの呼び出しをtry-catch文で囲む義務が生まれる
・例外をもみ消さない catchブロックの中身を空のままにすることは「発生した例外をキャッチしながら、自分では何の処理もせず、上にも報告しない」いわば「不祥事のもみ消し」
・例外的状況の報告(例外を投げる) throw 例外インスタンス; (例)throw new 例外クラス名("エラーメッセージ");
・オリジナル例外を定義する 従来の例外をextendsしてsuper(引数)で親を呼び出したりする

第18章
・ストリーム 情報が流れてくる小川のようなもの
・ファイルから1文字ずつ読み込む FileReaderクラス read()メソッド
・ファイルへ文字を書き込む FileWriterクラス write()メソッド
・インターネットへのアクセス URLクラス(Java20以降は非推奨)
Javaのストリーム 画面に繋がるSystem.out、キーボードに繋がるSystem.in

SQL データベース専用の言語でデータベースに指示を送れる
・ユーザーインタフェース プログラムの見た目・操作性
CUI(Character User Interface) 文字ベースのユーザーインタフェース
GUI(Graphical User Interface) グラフィカルに表示され、マウスなども使って操作できるソフトウェアのユーザーインタフェース
JVM上で動作するJava以外の言語 JRuby(Rubyなど従来からあるプログラミング言語JVM上で動作)、Scala(並列処理を得意とする)、Kotlin(Androidアプリ開発の新たな標準言語)
・Webアプリケーション 利用者がブラウザから入力した情報をサーバ側のプログラムで処理するしくみを備えたWebサイト
サーブレット(Servlet) Javaを使ってWebアプリケーションを開発する場合に用いられる