メモ

これは?

public class A{
  void hoge(){
    System.out.println("A");
  }
}

public class B extends A{
  void hoge(){
    System.out.println("B");
  }
}


public class Test{
  public static void main (String[] args){
    B b = new B();

    hoge(b);
  }

  public static void hoge(A a){
    a.hoge();
  }
}

あれ、これの実行結果。

B

だよねぇ。
テキストを読み違えたか?

  • オーバーライドしたメソッドの戻りは、サブクラスの型でもよい
    • 共変戻り値?
  • オーバーライド時にアクセスレベルをゆるくすることができる
  • 例外の数を減らしたり、範囲を狭くすることができる
  • 静的メソッドはオーバーライドできない
    • サブクラスで再定義することはできる
  • オーバーロード
    • 引数リストを変えなくてはならない(そりゃそうだ)
    • 戻り値も変えたものもオーバーロードと言う
    • アクセス修飾子も変える事ができる
    • 例外を追加してもオーバーロードと言う
    • hoge(String, String)とhoge(String...strings)はどうなるんだ?
    • 引数宣言が継承関係にある場合、宣言された型で呼び出しが行われる
      • public class A{}
      • public class B extends A{}
      • A a = new B();
      • この場合はhoge(A){}が呼び出される
  • ダウンキャストの間違いはコンパイルを通過する
    • A a = new B();
    • B b = (B)a;
    • これは実行時例外になる。
  • charとintの互換性?
  • superクラスのコンストラクタは暗黙的に呼び出される
  • 引数付きコンストラクタを作成すると、引数なしコンストラクタをコンパイラは作成しない
  • supre()かthis()は最初に書く
  • スーパーコンストラクタ実行時に、static変数は利用できる
  • コンストラクタをメソッドから呼び出すことはできない(コンストラクタからのみ呼び出すことができる)
  • デフォルトコンストラクタのアクセス修飾子はクラスと同じ
  • staticメソッドはインスタンス変数にアクセスできない