• ベストアンサー

インタフェースのstatic変数(Java)

インナークラスは、 アウタークラスがないとインスタンス化出来ないのでstatic変数を持てない、 と聞いたのですが、 では、なぜ同じくインスタンス化出来ないインタフェースはstatic 変数を持てるのでしょう? 教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • root139
  • ベストアンサー率60% (488/809)
回答No.2

#1 では、内部クラスとインターフェースでの static フィールドの扱い方の違いをあまり説明していなかったので補足します。 インターフェースでは public なメンバー以外持てませんが、その点以外の static フィールドの扱いは、内部クラスでもインターフェースでもほぼ同じで、下記の様になります。 ・final でない static フィールドは持てない ・final である static フィールドは持てる ただし、インターフェースは public static final のフィールドしか持てない事が決まっているので、構文上はそれらの記述を省略できます。 下記の例では AAA も BBB も CCC も public static final な定数です。 interface Hoge {  public static final String AAA = "aaa";  String BBB = "bbb"; // 実は public static final な定数。省略されているだけ。  static String CCC = "ccc"; // 実は public static final な定数。省略されているだけ。 } なお、細かいことを言えば、内部クラスの static フィールドは、定数か定数のみを含む式で初期化されなければならない、transient を付けてもコンパイルエラーにならないなどの違いは有るようです。

hakase-chan
質問者

お礼

ありがとうございます! むずかしいですね。

その他の回答 (1)

  • root139
  • ベストアンサー率60% (488/809)
回答No.1

インターフェイスのメンバーに定数が定義できるのは、インターフェイスが表すプロトコルの一部となりうるからです。 (本当は「(一般的な意味の)インターフェイスの一部となりうる」と言いたいところですが、「インターフェイスに定数が有るのはそれがインターフェイスの一部だから」では意味不明ですね) 例として java.sql.Connection を見てみましょう。 http://java.sun.com/javase/ja/6/docs/ja/api/java/sql/Connection.html Connection には下記の様なメソッドが有りますが、引数の内、後ろの2つのint型には、ResultSet で定義された定数と Collection 自身で定義された定数を渡すことが前提になっています。 PreparedStatement pstmt = conn.prepareStatement(   "SELECT ・・・",   ResultSet.CONCUR_READ_ONLY,   Connection.TRANSACTION_NONE ); http://java.sun.com/javase/ja/6/docs/ja/api/java/sql/Connection.html#prepareStatement%28java.lang.String,%20int,%20int%29 この Connection.TRANSACTION_NONE は確かにint値を持ちますが、その値自身に意味は無く、トランザクションの種類を伝えることが役目です。したがって、これらの定数は実装ではなくプロトコルの一部だと言えます。 ただし、インターフェイスに定義されているからといって、必ずしもプロトコルの一部になるわけでは有りません。いわゆる定数インターフェイスに定義されている定数などは、多くの場合は値自体が意味を持っており、実装そのものでしょう。

関連するQ&A