Java 備忘録(羅列)

#メモ程度の備忘録

##◆コンパイルエラー
###・エラー:\<identifier\>がありません。
型の指定がされているか確認。

##◆警告(クラスファイルは生成されている)
###・注意:『ファイル名』の操作は、未チェックまたは安全ではありません。
注意:詳細は、-Xlint:uncheckedオプションを指定して再コンパイルをしてください。
ジェネリクス<>による型推論の記載がされているか確認。

##◆その他
###・インスタンスイニシャライザ
ArrayListやHashMapを一行で初期化できる。

```java

// {{}} ←これがインスタンスイニシャライザの構文

List<String> list = new ArrayList<>() {{add("A"); add("B"); add("C");}}

// 可読性を考えると以下になる。

List<String> list = new ArrayList<> {
  { add("A");
    add("B");
    add("C");
  }
}
```


###・instanceof演算子
左辺(インスタンス)が右辺(型)と同一の型もしくは継承関係、実装関係にあるのなら「true」を返す。
型に互換性が<font color="DarkOliveGreen">まったくない</font>場合はコンパイルエラーが発生する。

```java

//・構文
//<インスタンス> instanceof <型タイプ>

class Main{
  public static void main(String... args){
    System.out.println(new A() instanceof B); // false
    System.out.println(new B() instanceof A); // true
    System.out.println(new C() instanceof A); // コンパイルエラー
  }
}

class A {}
class B extends A {}
class C {}
```

###・static initializerの(実行される)動き
***-case① クラスインスタンス化時 :***
static initializer ⇒ initializer(初期化ブロック) ⇒ コンストラクタ
(staticメンバがなくてもstaticイニシャライザは実行される。)

***-case② staticフィールドへのアクセス時 :***
★finalなしのときは...
フィールドが初期化されていても、いなくても関係なくstaticイニシャライザは実行される。
★finalありのときは...
フィールドが初期化されている場合は、実行されない。
フィールドが初期化されていない場合は、実行される。

***-case③ staicメソッドへのアクセス時 :***
finalあり、なし関係なく実行される。

###・equals()とhashCode()のオーバーライドする場合に従うべきルール
① 同一インスタンスへのhashCodeメソッドは同一の整数値を返すこと。
② equalsメソッドが「true」ならhashCodeメソッドも「true」を返すこと。
③ equalsメソッドが「false」ならhashCodeメソッドはどちらを返してもよい。
④ hashCodeメソッドが「false」ならequalsメソッドも「false」を返すこと。


###・オーバーライドされたメソッドの優先度
完全一致 > 継承関係 > 暗黙の型変換(拡大変換)(bit変換) > Autoboxing > 可変長引数

###・基本データ型(ラッパークラス)の注意事項

★型変換
　　　 　 　（暗黙の型変換）➡︎

|  byte  |  short |   int  |  long  |  float | double |
|:------:|:------:|-------:|:------:|:------:|:------:|
         |  char  |
　          　　　　⬅︎（キャストによる型変換)

★キャスト不要の縮小変換
byte、short、char、(int)では、
有効範囲内であればintの数値をキャストなしで受け取れる。（long、float、double、の数値は不可)

★算術演算子を使用する際の注意点
定義された変数にて、演算子（オペランドを２つ以上とる)を使用した段階で右辺のオペランドはint型として扱われる。
※変数の型がlong、float、doubleの場合はその限りではない。

```java
byte b1 = 1;
b1 = 1 + 1;    // 変数を使用しないのであれば問題なし
b1 = --b1;     // インクリメントの場合は問題なし
b1 = b1 * 1;   // コンパイルエラー
b1 = b1 / b1;  // コンパイルエラー

//対処法
int b1 = 1;    // int型で宣言
b1 = (byte)(b1 * 1);  // キャストする
```

###・ネストクラス
★ネストクラスの種類

- ネストクラス
- インナークラス (非staticクラス)
    - ローカルクラス (メソッド内クラス)
    - 匿名クラス
- statcクラス

★ネストクラスのルール

- static/非static 共通
    - 外側のクラスの同名のクラス名は使用できない
    - アクセス修飾子を使用できる
    - abstract、final修飾子を使用できる
    - インターフェース、抽象クラスの定義が可能
- staticクラスのみ
    - 非static/staticメンバをもつことができる
    - 外側のクラスで定義したインスタンス変数にアクセス不可
- 非staticクラスのみ
    - staticメンバの定義は不可
    - 外側のクラスで定義したインスタンス変数にアクセス可
- その他
    - インターフェースや抽象クラス内にもネストクラス(IF,abstract,class)が定義可能
    - 外側のクラスを実装(implements)、継承(extends)することができる

```java
//インナークラス(非staticクラス)のインスタンス化の構文
外側のクラス名.インナークラス名 変数名 = new 外側クラス().new インナークラス名();

//staticクラスのインスタンス化の構文
外側のクラス名.staticクラス名 変数名 = new 外側のクラス名.staticクラス名();

//定義例
class Outer{
  abstract class A {abstract void hoge();}
  class B extends A {void hoge(){}}
  static interface X {void bar();}
  static class Y implements X {public void bar(){}}
} 
```

★ローカルクラスのルール

- アクセス修飾子の使用不可
- static修飾子の使用不可
- abstract、final修飾子の使用可能
- 外側のクラスのメンバにアクセス可能
- ローカルクラスから外側のクラスのメソッドの引数およびローカル変数にアクセスする際は、各変数が実質的にfinalな変数(定数)でなければならない。
(実質的とはfinal修飾されていなくてもfinalとして扱われる。したがって、再代入できない。)

★匿名クラスのルール

- アクセス修飾子の使用不可
- static修飾子の使用不可
- abstract、final修飾子の使用不可
- 外側のクラスのメンバにアクセス可能
- 外側のクラスのメソッドの引数およびローカル変数に実質的なfinal変数としてアクセス可能
- コンストラクトの定義不可
- 式として扱われるため、末尾にセミコロンが必要

###・関数型インターフェース
★関数型インターフェースになるための要件

- 単一の抽象メソッドをもつインターフェースであること
- staticメソッドやデフォルトメソッドは定義可能
- java.lang.Objectクラスのpublicメソッドは<font color="DarkOrange">抽象メソッド</font>としての宣言は可能
- 関数型インターフェースとして明示する場合は、「＠FunctionalInterface」アノテーションを付与する。