class A3 {
  int i = 1;
  void hello() {
    System.out.println("Hello A3");
  }
}

class B3 extends A3 {
  String i = "test";  /* 同じiを使用 */
}

class C3 extends B3 {
  double i = 333;    /* 同じiを使用 */
  void hello() {
    System.out.println("Hello C3");
  }
}

class MethodOverriding3 {
  public static void main(String args[]) {
    B3 obj = new C3();

    obj.hello();  /* C3のメソッド適用,objが参照するオブジェクトの型依存 */
    System.out.println(obj.i); /* B3の変数適用,変数objの型依存 */
  }
}

変数とメソッドで依存場所が違っててちょっと違和感があります.
なんでこんな実装に??