プロが教える店舗&オフィスのセキュリティ対策術

インナークラスは、
アウタークラスがないとインスタンス化出来ないのでstatic変数を持てない、
と聞いたのですが、

では、なぜ同じくインスタンス化出来ないインタフェースはstatic 変数を持てるのでしょう?

教えてください。

A 回答 (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 を付けてもコンパイルエラーにならないなどの違いは有るようです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/11/02 16:34

インターフェイスのメンバーに定数が定義できるのは、インターフェイスが表すプロトコルの一部となりうるからです。


(本当は「(一般的な意味の)インターフェイスの一部となりうる」と言いたいところですが、「インターフェイスに定数が有るのはそれがインターフェイスの一部だから」では意味不明ですね)

例として java.sql.Connection を見てみましょう。
http://java.sun.com/javase/ja/6/docs/ja/api/java …

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 …

この Connection.TRANSACTION_NONE は確かにint値を持ちますが、その値自身に意味は無く、トランザクションの種類を伝えることが役目です。したがって、これらの定数は実装ではなくプロトコルの一部だと言えます。

ただし、インターフェイスに定義されているからといって、必ずしもプロトコルの一部になるわけでは有りません。いわゆる定数インターフェイスに定義されている定数などは、多くの場合は値自体が意味を持っており、実装そのものでしょう。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!