- ベストアンサー
アクセス修飾子の指定相手とスコープの関係性
- アクセス修飾子の指定相手とスコープの関係性について考える。
- クラスやメンバに付けられるアクセス修飾子の組み合わせによって、アクセスできるスコープが変わる。
- クラスやインターフェースのアクセス修飾子について理解するための例を示す。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 クラスのアクセス制御で private 指定は内部クラスでのみ、可能です。 実際、(2)についてですが、 private class MyClass2{ public int n2; } 内部クラスのアクセス制御は、private、でもメンバーは public。 この形は、見たことあります。 ArrayList などの List の Iterator がこういう形で実装されていますね。 List の Iterator は、iterator()メソッドからでしか、得ることができない仕様です。 内部クラスである Iterator を、よそのクラスから、勝手にインスタンス化されても困るわけです。 よって、クラスのアクセス制御は private です。 iterator()メソッドを介して得た Iterator のインスタンスは、他のクラスから使えなくては意味がないので、各メソッドは、当然 public です。
その他の回答 (2)
- ketuago65
- ベストアンサー率50% (13/26)
(2)についてですが >http://www.tohoho-web.com/java/modifier.htm >こちらなどでは、クラスにもprivateを使えるような記述があるのですが…。 ここのページを見てみましたが、間違っているので正しいものを覚えなおしましょう。 クラスに使えるアクセス修飾子はpublicとデフォルト(何も付けない)の2つだけです。 (5)のインターフェースについて インターフェースにはメソッドと定数のみ宣言できます。 なのでメソッドを書いてもエラーにはなりません。 メソッドの中に処理を書いてしまうとエラーになります。 >インターフェースにabstractキーワードを指定できる意味がよく分かりません。 もともとインターフェースはabstractでしか宣言できないので付けなくても 自動でabstractになります。なので付けても付けなくもいいという仕様になってます。 インターフェースのメソッドが自動でpublic abstractになるのと同じ感じです。 ちなみにご存知だと思いますが変数はpublic static finalに自動でなるので 定数になります。これらも書いても書かなくてもOKです。
お礼
>ここのページを見てみましたが、間違っている 他のページでも、同様のこと(つまり、誤った記述)が書かれていたので、 私は、そちらの誤った方を、正しいと思ってしまいました。失礼致しました。 しかし、異なる2サイトを調べてみて、その2サイトとも、誤った記述だったため、 そちらの誤った方を正しいと思っても、仕方ない部分もありますよね?笑 と、言い訳がましいことを言ってみましたが、そんなことはどうでもよいのです。 正しいことが分かれば、私はそれで満足です。 また、そもそも、 private class の意味が分かりませんもんね。 一体、このclassには、どこからならアクセスできるんじゃいっ、 てな気持ちになりますので。 ということで、原理的に考えても、 private class という記述はやはりオカシイのです。うむ。 なお、インターフェースの補足についてですが、 こちらは、おかげさまで、ほぼ問題なく理解できました。 以上、回答をありがとうございました。 とても助かりました。
- kenichiice
- ベストアンサー率72% (27/37)
大体正しく理解されているように思え、どこに疑問があるのかよく分かりませんでした。 > //(1) > //↑クラス自体は、どこからでも使用可能だが、 > //フィールドn1はMyClass1内部からのみ使用可能。 そうですね、その認識で正しいと思います。 > //(2) > //↑ん~、なんだこりゃ~??(こんな書き方はない??) そうですね、classにprivateという修飾子は付けられません。 > //(3) > //↑インターフェース自体も、そのフィールド(定数)n3も、どこからでも使用可能! その認識で正しいと思います。 > //(4) > //↑インターフェース自体も、そのフィールド(定数)n4も、 > //同じパッケージ内からのみ使用可能! その認識で正しいと思います。 > //(5) > //↑なんじゃこりゃー!わかりませんっ! > //もし仮に、このインターフェースにメソッドを書かないとエラーが出ます? > //というか、インターフェースにabstractキーワードを指定できる意味がよく分かりません。 インタフェースにはメソッドが無くてもかまいません。例えば、java.io.Serializable にはメソッドがありません。 インタフェースには、abstract修飾子を付けても付けなくても意味は変わりません。
お礼
このようなグダグダな質問に、回答下さり、ありがとうございます。 丁寧な回答でしたので、とてもよく分かりました。 >そうですね、classにprivateという修飾子は付けられません。 えっ、そうだったんですか!笑 http://www.tohoho-web.com/java/modifier.htm こちらなどでは、クラスにもprivateを使えるような記述があるのですが…。
お礼
いつもありがとうございます。 今回もまた、私には難しい例で説明されてありましたため、 やや理解できていない部分も多いのですが、 それでも、大枠として、 「クラスのアクセス制御で private 指定は内部クラスでのみ、可能です。」 ということはしっかりキャッチできましたので、大変感謝している次第です。 つまり、インナークラスに対しては、privateで修飾することができるわけですよね。 なので、一概に、privateでclassを修飾することはできない、とは言えないわけですね。 もっとも、私のような未熟者が、privateでclassをアクセス制御することなど、 考える必要もなければ、また、実際に考えてプログラムを組むこともないのでしょうけれど…。 以上、参考になりました。ありがとうございます。