0
0

More than 3 years have passed since last update.

Java 備忘録(羅列)

Last updated at Posted at 2019-11-06

メモ程度の備忘録

◆コンパイルエラー

・エラー:<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」アノテーションを付与する。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0