Java SE 11 Gold 自分用メモ(1)

  1. インナークラス・staticインナークラスともに、全アクセス修飾子(public/protected/private)、final、abstract付与可能
  2. ローカルクラス(メソッド内で一時的に定義されるクラス)はfinalとabstractのみ付与可能、匿名クラスはアクセス修飾子、final、abstract、staticいずれも付与不可能
  3. OuterクラスのインナークラスInnerをインスタンス化したい場合の書式は
    new Outer().new Inner()
  4. OuterクラスのstaticインナークラスStaticInnerをインスタンス化したい場合の書式は
    new StaticInner()
  5. Outerクラスが持つメンバーmがprivateであってもインナークラスInnerから参照可能(ただしstaticインナークラスStaticInnerから参照したい場合はmもstaticでなければ参照不可能)
  6. 非staticのインナークラスにはstaticメンバを定義不可能
  7. ローカルクラスがローカル変数を参照する場合、必ずローカルクラスが定義される行よりも上の行でローカル変数が定義されていなければならず、そのローカル変数の値を変更しようとするとコンパイルエラーとなる
  8. 匿名クラスの定義方法:インタフェースを実装したクラスとするか、(具象か抽象かを問わず)別クラスのサブクラスとするかのどちらかの形で実装のみを定義する
  9. 匿名クラスには元クラスに存在しないメソッドを独自に定義することも可能(匿名クラスの内部にコンストラクタを定義することはできない)
  10. 元クラスOriginにはないメソッドmetを持つ匿名クラス型インスタンスへの参照を変数aに持たせたい場合、Java SE 10以降で使用可能となったvarによる型推論を使用し以下のように書く
    var a = new Origin() {
      public void met() {
        System.out.println("yahoo");
      }
    };
  11. Java SE 8からはインタフェースにstaticメソッドを定義可能となった(ただし呼び出す時にはそのインタフェース名を指定せねばならず、サブインタフェースや実現クラスの名前では呼び出すことができない)
  12. クラスまたはインタフェースに定義したstaticメソッドはオーバーライド不可能(全く同一のシグネチャであるstaticメソッドに対して@Overrideアノテーションをつけるとコンパイルエラーになり、つけない場合はコンパイル成功する)
  13. インタフェースAのデフォルトメソッドをサブインタフェースや実現クラスでオーバーライドし、オーバーライドしている側がAのデフォルトメソッドを呼び出す場合、サブインタフェースや実現クラスはAと直接の関係を持たねばならず、以下のように書く
    A.super.defaultMethod()
  14. インタフェースAを実現するとともにクラスBを継承するクラスCがあり、Aのメソッドと全く同一のシグネチャであるメソッドをBが持つ場合、Cのインスタンスがそのメソッドを呼び出すとクラスBでの定義が優先される(Bのソースでメソッドにpublic以外のアクセス修飾子が付いている場合はコンパイルエラーになる)
  15. Java SE 9以降ではインタフェースにもprivateメソッドを定義可能(ただし具象メソッドのみで、defaultをつけずに書く)
  16. 独自の列挙型MyEnumを定義すると、以下の2メソッドがコンパイラにより自動で追加される
    public T[] values();
    public T valueOf(String name);
  17. 定義した列挙型が初めて利用される時に各列挙子がインスタンス化され、それ以降列挙子のインスタンス化は二度と行われず常に同じ参照(以下のbはtrue)となる
    MyEnum me = MyEnum.STAR;
    boolean b = MyEnum.STAR == me;
  18. 列挙型のtoStringメソッドはデフォルトでは列挙子の名前をそのまま返す
  19. 列挙型にコンストラクタを明示的に定義したい場合は必ずアクセス修飾子privateをつける

 

※列挙型のサンプルコード

public enum Status {
  OK(200), BAD_REQUEST(400), INTERNAL_SERVER_ERROR(500);
  private int code;
  private Status(int code) {
    this.code = code;
  }
  @Override
  public String toString() {
    return String.valueOf(this.code);
  }
}