#メモ程度の備忘録
##◆コンパイルエラー
###・エラー:<identifier>がありません。
型の指定がされているか確認。
##◆警告(クラスファイルは生成されている)
###・注意:『ファイル名』の操作は、未チェックまたは安全ではありません。
注意:詳細は、-Xlint:uncheckedオプションを指定して再コンパイルをしてください。
ジェネリクス<>による型推論の記載がされているか確認。
##◆その他
###・インスタンスイニシャライザ
ArrayListやHashMapを一行で初期化できる。
// {{}} ←これがインスタンスイニシャライザの構文
List<String> list = new ArrayList<>() {{add("A"); add("B"); add("C");}}
// 可読性を考えると以下になる。
List<String> list = new ArrayList<> {
{ add("A");
add("B");
add("C");
}
}
###・instanceof演算子
左辺(インスタンス)が右辺(型)と同一の型もしくは継承関係、実装関係にあるのなら「true」を返す。
型に互換性がまったくない場合はコンパイルエラーが発生する。
//・構文
//<インスタンス> 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、の数値は不可)
★算術演算子を使用する際の注意点
定義された変数にて、演算子(オペランドを2つ以上とる)を使用した段階で右辺のオペランドはint型として扱われる。
※変数の型がlong、float、doubleの場合はその限りではない。
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)することができる
//インナークラス(非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メソッドは抽象メソッドとしての宣言は可能
- 関数型インターフェースとして明示する場合は、「@FunctionalInterface」アノテーションを付与する。