////////////////////////////////////////////////////////////////////////////////
//  << j252c.java >>
//
//  クラス(5):インターフェース(多態性)
//
//  インターフェースは、オブジェクトを作れない。
//  しかし、インターフェース型の変数を宣言して、インターフェースを
//  実装しているクラスのオブジェクトを指すことはできる。
//
//      インターフェース名 変数名 = new クラス名(); 
//
//  (性質1)インターフェースで定義された変数、
//       インターフェースで定義され、クラス内で実装されたメソッドに
//       アクセスできる。
//  (性質2)クラスで新たに定義された変数やメソッドにはアクセスできない。
//
//  (1)インターフェース(intf)の定義。
//  (2)インターフェース(intf)の実装。
//  (3)クラスで新たに定義したメソッドm。
//  (4)インターフェースはオブジェクトを作れない。
//  (5)インターフェース型の変数を宣言し、インターフェース(intf)を
//     実装しているクラスのオブジェクトを指すことはできる。
//  (6)インターフェース内フィールドobj2.msgへのアクセス可能。
//  (7)インターフェース内メソッドmiへのアクセス可能。
//  (8)クラス内フィールドobj2.aへのアクセスはできない。
//  (9)クラス内メソッドmを呼び出せない。
//
///////////////////////////////////////////////////////////////////////////////

interface intf { //(1)
  String msg = "interface内メッセージ";
  void mi(); 
}

class C implements intf { 
  int a = 111;
  public void mi() { //(2)
    System.out.println("クラス(C)で実装したインターフェイス内メソッド(mi)");
  }
  void m() { //(3)
    System.out.println("クラス(C)で定義したメソッド(m)");
  }
}

class j252c {
  public static void main(String args[]) {

    System.out.println("(4)intf obj1 = new intf() は、エラー");

    intf obj2 = new C(); //(5) 

    System.out.println("(6)obj2.msg:" + obj2.msg); //(6)

    System.out.print("(7)obj2.mi():"); obj2.mi(); //(7)

    System.out.println("(8)obj2.a は、エラー"); //(8)

    System.out.println("(9)obj2.mc() は、エラー"); //(9)

  }

}
実行結果
% javac j252c.java
% java j252c
(4)intf obj1 = new intf() は、エラー
(6)obj2.msg:interface内メッセージ
(7)obj2.mi():クラス(C)で実装したインターフェイス内メソッド(mi)
(8)obj2.a は、エラー
(9)obj2.mc() は、エラー