Java SE 11 Silver 備忘録

#やったこと
すっきりわかるJava入門編一周（約三日）
黒本3~4周（二週間）
#解き方
型とアクセス修飾子と継承関係に注意する。
#継承
エントリーポイント＝mainメソッドのこと
###アクセス修飾子は`private>default>protected>public`となっている。
Privateは他のクラスから使えない
defaultは同じパッケージの属するインスタンスからのアクセスを許可
protectedは異なるパッケージでも継承関係にあればアクセスを許可
publicはどこでも使える
interfaceにdefaultでメソッドを記述することで実現クラスがメソッドを記述じなくても共通で使用できる。
interfaceのdefaultメソッドはjava,lang.Objectクラスに定義されているもの(toString,equals)を使用するとコンパイルエラーになる。
サブクラスからスーパークラスのメソッドを呼び出す際`super.メソッド（引数）`を使用し、さらにデフォルトメソッドを呼び出す際は、`インターフェース名.super.メソッド名（）`になる。
###オーバーロードはメソッド名が同じで引数が異なる。
###オーバーライド
・メソッドのシグニチャ（メソッド名、引数リストの型、数、順番）が同じでないといけない。
・戻り値型が同じ、もしくはサブクラス（Number -> Integer)であるか
・アクセス修飾子が同じかより緩いもであるか。

で親のメソッドを呼べる。

```
public Interface A {
	void func1();
}

public class B implements A {
	public void func2() {
		//any code
	}
	public void func3() {
		//any code
	}
	
}

public class C extends B {
	public void func4() {
		//any code
	}
}
```
##この状況でコンパイルエラーになる例
new A()でAのインスタンス作成。インターフェースはインスタンス作成できない。

```
A a = new C();
A.func4();
```
Aの型でインスタンス作成しているのにCのメソッドをよんでしまっている。
親のクラスで型宣言したあとに子クラスのメソッドは使用できない。
使用する場合はダウンキャストで
B b = (B) a;と記述してからBのメソッドを使用する。

```
B b ＝ new B();
C c = (C)b;
c.func4
```
を実行するとキャストダウンでCの型には変更できたが、インスタンスの参照先は変わっていない為、型変換のエラーがスローされます。

##Javaのsuperとthis
##Javaのsuper
スーパークラスメソッドを呼ぶ際使用しますが、コンストラクタでも`A a = new B();`でBのコンストラクタを呼び出しても、スーパークラスのコンストラクタ(A)から処理がはじまるように自動でsuper()が追加されて、スーパークラスのコンストラクタから処理をする。
##this
クラスのフィールド値をメソッドで参照する際`this`を使って`this.value = value;`と記述しますが、他にもコンストラクタ内からオーバーロードされた別のコンストラクタを呼ぶときに使用します。

```java

class Parent {
   public Parent() {
     System.out.println("A");
   }
   public Parent(String val) {
     this();
     System.out.println(val);
   }
}

class Child extends Parent {
   public Child() {
     super("B");
     System.out.println("C");
   }
   public Child(String val) {
     this();
     System.out.println(val);
   }
}

public class Main {
   public static void main(String[] args) {
    new Child("D");
   }
   
}
```
##コードの説明
上記コードの出力結果はABCDです。
なぜかというとnewでChildのインスタンスを作成するとChildクラスの文字列リテラル型のコンストラクタが実行されて`Child(String val)` -> `this()` -> `public Child()` -> `super("B")` -> `public Parent(String val)` -> `this()` -> ` public Parent()`と呼ばれて上から順に実行されます。

##整数リテラル　
頭の文字が決まってる。二進数0b, 八進数0,16進数0x
###アンダースコア（_）
・リテラルの先頭と末尾には記述できない。
・記号の前後には記述できない。
・利用できる記号は、小数点を表すドット.　L　F　二進数0b, 八進数0,16進数0x
###コンスタントプール
==は本来

```
String a = "string"; 
String b = "string";
a == b;
```
と書くと同一性の観点からすれば、falseが返されるはずですが、コンスタントプールというものがあり、同じ文字列リテラルがプログラム内に再び登場すれば、同じ参照先を表すことになり、trueになる。

#諸々
List ofメソッドは変更できないコレクションを作成するため。clearなどで削除された場合は例外がスローされる。
引数なしで作成したofメソッドのコレクションにaddメソッドなどで要素を追加しても例外がスローされる。
Ofメソッドで作成したコレクションは読み出し専用
Privateメソッドオーバーライドできない。@Overをつけるとコンパイルエラーになる
Localdate.nowではデフォルトyyyy-mm-ddと表示される
初期化していないローカル変数を参照しようとするとコンパイルエラーになる
ラムダ式のなかでi++とインクリメントするとコンパイルエラーになる
Java.langはimportしなくて良い
Moduleが相互依存だとコンパイルエラーになる
引数はより厳密な方を優先する。例：(Object [])と(String[])だと後者が優先される。
戻り値が宣言されていたらメソッド、ない場合コンストラクタ

Aが親でBが子クラスで A a= newB();
としてもbクラスでメソッドがオーバーロードされていた場合A型で生成しているがBのメソッドが実行される

継承関係、実現関係にないクラスをキャストするとClassCastExceptionという例外がスローされる。
equalsメソッドなどはintanceOf演算子をつかって、例外処理を記述しなければならない。
privateなメソッドはオーバーライドできないので同じシグニチャでもオーバーロードされたものである。（アクセス修飾子に気をつける。）
do-whileは中かっこ{}を省略して二文以上書くとコンパイルエラーになる
#同値性と同一性
equalsメソッドはオーバーライドしないと同一性を検証します。なので同じ値でも参照先が違えばfalseが返ってくる。
引数の型がobjectだと同一性を検証します。
String型だと普通に同値性を検証してくれる。
intern()は参照先がひとつしかないので違うインスタンスでもintern()で参照すれば同じ参照先とみなされtrueが返ってくる。
#例外処理
例外処理のthorws文はエラーが起きる可能性があるメソッドで宣言し、メソッド内でthrowでエラーをなげて別メソッドで例外処理を行う。
黒本でmainメソッドでthrows宣言するところがあります。一応mainメソッドでもthrows宣言できますが、エラーを投げっぱなしで処理してくれるところはありません。
#モジュールシステム
モジュールの設定情報を調べるためのコマンド
`java --describe-module`
`jmod describe`
モジュールの依存関係を調べるコマンド
`jdeps --list-deps hoge,jar`
`--show-module-resolution`