package lecture.etc;

import jp.avaj.lib.debug.Test;

/**
 * staticメソッドはoverrideできない Java
 *
 * 継承関係にあるクラスで、メソッドをオーバーライドしている時、
 * インスタンスメソッドは、実際のオブジェクトが何であるかによってメソッドが決定される
 * スタティックメソッドは、オブジェクトが代入された変数の型によってメソッドが決定される
 *
 * これは、わりと分かりにくいバグの原因になるので注意すること
 */
class StaticMethodCantOverride {
  public static void main(String[] args) {
    // 継承クラスのオブジェクトを生成し、基底クラスの変数に代入
    Base baseObj = new Extended();
    //
    //
    Test.testCase("StaticCantOverride-0");
    // インスタンスメソッドの呼び出し ⇒ 継承クラスのメソッドが呼び出される
    Test.checkStr(baseObj.instanceMethod(),"継承クラス・インスタンスメソッド");
    //
    //
    Test.testCase("StaticCantOverride-1");
    // staticメソッドの呼び出し ⇒ 基底クラスのメソッドが呼び出される
    Test.checkStr(baseObj.staticMethod(),"基底クラス・スタティックメソッド");
    //
    //
    Test.testCase("StaticCantOverride-2");
    // 継承クラスの変数に代入
    Extended exObj = (Extended)baseObj;
    // staticメソッドの呼び出し ⇒ 継承クラスのメソッドが呼び出される
    Test.checkStr(exObj.staticMethod(),"継承クラス・スタティックメソッド");
  }

  /** 基底クラス */
  private static class Base {
    public String instanceMethod() {
      return "基底クラス・インスタンスメソッド";
    }
    public static String staticMethod() {
      return "基底クラス・スタティックメソッド";
    }
  }

  /** 継承クラス */
  private static class Extended extends Base {
    public String instanceMethod() {
      return "継承クラス・インスタンスメソッド";
    }
    public static String staticMethod() {
      return "継承クラス・スタティックメソッド";
    }
  }
}
//---------------------------------------------------
//・目次 Javaエトセトラ
//  http://blogs.yahoo.co.jp/artery2020/40576157.html
//・目次 - Java入門
//  http://blogs.yahoo.co.jp/artery2020/39975776.html
//・目次 - ビジネスパーソンの常識と非常識
//  http://blogs.yahoo.co.jp/artery2020/39728331.html
//・目次 - 論理・発想・思考についての考察と鍛え方
//  http://blogs.yahoo.co.jp/artery2020/39657784.html
//---------------------------------------------------