アクセス修飾子の指定相手とスコープの関係性

このQ&Aのポイント
  • アクセス修飾子の指定相手とスコープの関係性について考える。
  • クラスやメンバに付けられるアクセス修飾子の組み合わせによって、アクセスできるスコープが変わる。
  • クラスやインターフェースのアクセス修飾子について理解するための例を示す。
回答を見る
  • ベストアンサー

アクセス修飾子の指定相手と、そのスコープとの関係性。

アクセス修飾子の指定相手と、そのスコープとの関係性。 Java初心者であるため、変なことを言うかもしれませんが、宜しくお願い致します。 クラスや、メンバにアクセス修飾子は付けられますが、 その修飾のしかたの組み合わせによって、 アクセスできるスコープが色々と場合分けされると思うのですが、 このあたりは、どう考えたら良いのでしょうか? 例えば、 //(1) public class MyClass1 {  private int n1; } //↑クラス自体は、どこからでも使用可能だが、 //フィールドn1はMyClass1内部からのみ使用可能。 //(2) private class MyClass2{  public int n2; } //↑ん~、なんだこりゃ~??(こんな書き方はない??) //------------------------------ //(3) public interface MyInterface{  int n3 = 3; } //↑インターフェース自体も、そのフィールド(定数)n3も、どこからでも使用可能! //(4) interface MyInterface{  int n4 = 4; } //↑インターフェース自体も、そのフィールド(定数)n4も、 //同じパッケージ内からのみ使用可能! //(5) abstract interface MyInterface{  int n5 = 5;  void mymethod();  //自動的にpublic abstract指定になるのですよね…?  abstract mymethod2();  //publicだけ、自動指定される扱い、といった感じで…。 } //↑なんじゃこりゃー!わかりませんっ! //もし仮に、このインターフェースにメソッドを書かないとエラーが出ます? //というか、インターフェースにabstractキーワードを指定できる意味がよく分かりません。 //------------------------------ (1)~(2)がクラス編、(3)~(5)がインターフェース編。 特に(2)、(5)について、どなたかアドバイスして下さい。

  • Java
  • 回答数3
  • ありがとう数5

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

  • ベストアンサー
  • PecoPlus
  • ベストアンサー率76% (144/188)
回答No.3

 こんにちは。  クラスのアクセス制御で private 指定は内部クラスでのみ、可能です。  実際、(2)についてですが、 private class MyClass2{  public int n2; }  内部クラスのアクセス制御は、private、でもメンバーは public。  この形は、見たことあります。  ArrayList などの List の Iterator がこういう形で実装されていますね。  List の Iterator は、iterator()メソッドからでしか、得ることができない仕様です。  内部クラスである Iterator を、よそのクラスから、勝手にインスタンス化されても困るわけです。  よって、クラスのアクセス制御は private です。  iterator()メソッドを介して得た Iterator のインスタンスは、他のクラスから使えなくては意味がないので、各メソッドは、当然 public です。

nbsp0606
質問者

お礼

いつもありがとうございます。 今回もまた、私には難しい例で説明されてありましたため、 やや理解できていない部分も多いのですが、 それでも、大枠として、 「クラスのアクセス制御で private 指定は内部クラスでのみ、可能です。」 ということはしっかりキャッチできましたので、大変感謝している次第です。 つまり、インナークラスに対しては、privateで修飾することができるわけですよね。 なので、一概に、privateでclassを修飾することはできない、とは言えないわけですね。 もっとも、私のような未熟者が、privateでclassをアクセス制御することなど、 考える必要もなければ、また、実際に考えてプログラムを組むこともないのでしょうけれど…。 以上、参考になりました。ありがとうございます。

その他の回答 (2)

  • ketuago65
  • ベストアンサー率50% (13/26)
回答No.2

(2)についてですが >http://www.tohoho-web.com/java/modifier.htm >こちらなどでは、クラスにもprivateを使えるような記述があるのですが…。 ここのページを見てみましたが、間違っているので正しいものを覚えなおしましょう。 クラスに使えるアクセス修飾子はpublicとデフォルト(何も付けない)の2つだけです。 (5)のインターフェースについて インターフェースにはメソッドと定数のみ宣言できます。 なのでメソッドを書いてもエラーにはなりません。 メソッドの中に処理を書いてしまうとエラーになります。 >インターフェースにabstractキーワードを指定できる意味がよく分かりません。 もともとインターフェースはabstractでしか宣言できないので付けなくても 自動でabstractになります。なので付けても付けなくもいいという仕様になってます。 インターフェースのメソッドが自動でpublic abstractになるのと同じ感じです。 ちなみにご存知だと思いますが変数はpublic static finalに自動でなるので 定数になります。これらも書いても書かなくてもOKです。

nbsp0606
質問者

お礼

>ここのページを見てみましたが、間違っている 他のページでも、同様のこと(つまり、誤った記述)が書かれていたので、 私は、そちらの誤った方を、正しいと思ってしまいました。失礼致しました。 しかし、異なる2サイトを調べてみて、その2サイトとも、誤った記述だったため、 そちらの誤った方を正しいと思っても、仕方ない部分もありますよね?笑 と、言い訳がましいことを言ってみましたが、そんなことはどうでもよいのです。 正しいことが分かれば、私はそれで満足です。 また、そもそも、 private class の意味が分かりませんもんね。 一体、このclassには、どこからならアクセスできるんじゃいっ、 てな気持ちになりますので。 ということで、原理的に考えても、 private class という記述はやはりオカシイのです。うむ。 なお、インターフェースの補足についてですが、 こちらは、おかげさまで、ほぼ問題なく理解できました。 以上、回答をありがとうございました。 とても助かりました。

回答No.1

大体正しく理解されているように思え、どこに疑問があるのかよく分かりませんでした。 > //(1) > //↑クラス自体は、どこからでも使用可能だが、 > //フィールドn1はMyClass1内部からのみ使用可能。 そうですね、その認識で正しいと思います。 > //(2) > //↑ん~、なんだこりゃ~??(こんな書き方はない??) そうですね、classにprivateという修飾子は付けられません。 > //(3) > //↑インターフェース自体も、そのフィールド(定数)n3も、どこからでも使用可能! その認識で正しいと思います。 > //(4) > //↑インターフェース自体も、そのフィールド(定数)n4も、 > //同じパッケージ内からのみ使用可能! その認識で正しいと思います。 > //(5) > //↑なんじゃこりゃー!わかりませんっ! > //もし仮に、このインターフェースにメソッドを書かないとエラーが出ます? > //というか、インターフェースにabstractキーワードを指定できる意味がよく分かりません。 インタフェースにはメソッドが無くてもかまいません。例えば、java.io.Serializable にはメソッドがありません。 インタフェースには、abstract修飾子を付けても付けなくても意味は変わりません。

nbsp0606
質問者

お礼

このようなグダグダな質問に、回答下さり、ありがとうございます。 丁寧な回答でしたので、とてもよく分かりました。 >そうですね、classにprivateという修飾子は付けられません。 えっ、そうだったんですか!笑 http://www.tohoho-web.com/java/modifier.htm こちらなどでは、クラスにもprivateを使えるような記述があるのですが…。

関連するQ&A

  • 【アクセス修飾子】アクセス修飾子無しのクラスにpublicなメソッド

    アクセス修飾子無しのクラスのメソッドにpublicを付ける意味がわかりません。 class MyClass {  public void method() {} } 例えばこのようなクラスがあったとします。 このクラスはアクセス修飾子無しで他のパッケージからはアクセス出来ない為、メソッドにpublicを付ける意味は無いと思うのですが、付けてもコンパイルは通ります。 何故なんだろう、と考えてみたのですが、例えばpublicなメソッドを持つpublicなクラスを継承し、そのメソッドをオーバーライドした時にメソッドにpublicを付けざるを得ない、あるいは、インターフェイス(暗黙的にメソッドにpublicが付く)を実装したときにメソッドにpublicを付けざるを得ない等、そういう場合に対応するための『遊び』みたいなものなのでしょうか? 御教授よろしくお願いします。

    • ベストアンサー
    • Java
  • 継承・実装の関係で悩んでいます。

    継承・実装の関係について悩んでいます。 ここでは、アクセス制御を考えずに、インスタンスかstaticかabstract(ここではabstract final staticやabstract classのこと)の違いで、どう継承するのか考えています。 // 継承 はメソッドのオーバーライドのことを考えます。(オーバーロードは考えない) クラスAからクラスBでオーバーライドしたメソッドは、 クラスCでさらにオーバーライドできるのでしょうか? クラスCが クラスBのクラスAからオーバーライドしたメソッド をクラスBのメソッドとして見たときに、オーバーライドすることは可能なのでしょうか? クラスA │ インスタンスフィールドA │ staticフィールドA │ │ クラスA() { } │ │ インスタンスメソッドA () { } │ staticメソッドB() { } ↓ クラスB extends クラスA │ インスタンスフィールドA // 継承 │ インスタンスフィールドB │ staticフィールドB │ │ サブクラス1() { } // コンストラクタは継承しない、super()で呼び出す │ │ インスタンスメソッドA () { } // 継承 │ │ インスタンスメソッドB () { } │ staticメソッドB () { } ↓ クラスC extends クラスB implements インタフェースD, ... ↑ インスタンスフィールドA // クラスBのフィールドを継承 │ インスタンスフィールドB // クラスBのフィールドを継承 │ インスタンスフィールドC │ staticフィールドC │ │ サブクラス2() { } │ │ インスタンスメソッドA () { } // クラスBのメソッドを継承 │ インスタンスメソッドB () { } // クラスBのメソッドを継承 │ インスタンスメソッドD () { } // インタフェースDのメソッドを実装 │ インスタンスメソッドE () { } // インタフェースDのメソッドを実装 │ │ │ インスタンスメソッドC () { } │ staticメソッドC() { } │ interface インタフェースD extends インタフェースE ↑ │ staticフィールドD // public static final │ │ インスタンスメソッドD() { } // public abstract │ インスタンスメソッドE() { } // 継承 │ interface インタフェースE staticフィールドE // public static final インスタンスメソッドE() { } // public abstract

    • ベストアンサー
    • Java
  • C#文字でクラスのメンバにアクセス

    通常クラスを使用する場合は、以下のコードで使用できますが、 MyClass m = new MyClass(); m.MyInt = 0; m.MyString = ""; 下記のイメージで文字でクラスのメンバにアクセスできませんか。(大量のクラスがあり、intのメンバだけを一気に初期化したい) MyClass m = new MyClass(); m["MyInt"] = 0; お願いします。

  • アクセス修飾子

    アクセス修飾子 が理解できません。 ヘルプやインターネットで調べると下記のようにかかれています。 public 『アクセスの制限はありません。 』 protected 『アクセスは、コンテナ クラス、またはコンテナ クラスから派生した型に制限されます。 』 internal 『アクセスは現在のプロジェクトに制限されます。 』 protected internal 『アクセスは、現在のプロジェクト、またはコンテナ クラスから派生した型に制限されます。 』 private 『アクセスはコンテナ型に制限されます。』 public 、private は理解できるのですが、protected 、internal が理解できません。 Javaだとprotectedは同じパッケージ内、サブクラスでアクセス可能とかかれています。 .NETも同じでしょうか? 同じパッケージ内?ってどういうこと?となっています。 1つのオブジェクト内に2つのクラスを作成し、 クラスAのメソッドに protectedで作成し 、クラスBでクラスAの宣言をしたらAのprotectedのメソッドは使用できません。どういう場合にprotectedのメソッドは使用できるのでしょうか?

  • 【C#】クラスのメンバ変数のアクセス修飾子の省略

    初歩的な質問かもしれませんが、 C#にてクラスのメンバ変数を定義する際、 public int x; public int y; のように、変数一つずつにアクセス修飾子をつけなければいけないのでしょうか? 例えば、C++/CLIだと public: int x; int y; のように書くことで、個別に修飾子をつけなくても、 複数の変数に対してアクセスレベルを設定できたのですが。。 ご存知の方おられましたら、ご教示お願い致します。

  • C#でインターフェースのプロパティのアクセス修飾子

    お世話になります。 C#でインターフェースに定義した抽象プロパティで、アクセシビリティまで設定したいです。 例として抽象プロパティHelloのgetをpublic、setをinternalに設定したい場合、次の様に書くと怒られます。 string Hello { get; internal set; } ←"アクセシビリティ修飾子をインターフェイスのアクセサーで使用することはできません。" 抽象プロパティにsetを定義せず、サブクラスでinternalを設定して実装する分には怒られませんが、 この場合はサブクラスに対してsetの実装を強制できませんし、 当然API(インターフェース)型変数からsetの実装を呼び出せません。 全てのクラスはAPIからのみ利用させたいと考えていて、 かつプロパティのset、getで設定したいアクセス修飾子が異なる様な場合、 プロパティを使用せず自前でアクセッサを作るしか無いのでしょうか? 何かおいしい逃げ方がありましたらご教示いただけるとありがたいです。 宜しくお願いします。

  • 内部クラスのスコープについて。

    内部クラスのスコープ、friendクラスのスコープについて詳しいかたお願いします。 以下のクラス構成の場合に、 1.Outerクラスのすべてメンバー関数からはInnerクラスのすべての関数にアクセスできるのでしょうか? 2.InnerクラスからOuter::outerPrivateFunction(); を利用するためにはInnerクラスをOuterクラスのfriendにする方法以外にありますでしょうか? 3.InnerクラスからOuter::outerInt にどのようにしてもアクセスできません。ためした方法はInnerクラスをOuterクラスのfriendにする方法です。 このようなクラス構成にしてしまうと不可能なのでしょうか? 4.friendにしたクラスはprivateの変数、関数にアクセス可能になるはずですが、 それは外部クラスに限ってのことで内部クラスには当てはまらないのでしょうか? class Outer { private: class Inner { Innerfunction(); Onter* pOuter; } outerPrivateFunction(); int outerInt; } 説明に不足があれば補足いたしますのでお詳しいかた宜しくお願いします。

  • 優先順位

    優先順位の事で質問なのですが、 クラス myclass にint型のstatic型のnがあるのですが、 myclass.n++; と書いたとき、 .と++の優先順位が同じなのですが、 これはちゃんとmyclass.nがインクリメントされているのでしょうか? お願いします。

    • ベストアンサー
    • Java
  • 継承、実装についてまとめています。この図は正しいですか?

    継承、実装についてまとめています。この図は正しいですか? クラス1 から継承した クラス2のものを、クラス3で継承するのでしょうか? クラス1 │ int a; │ static int b; │ │ クラス1() { } │ │ int methodA () { } │ static int methodB() { } ↓ サブクラス1 extends クラス1 │ int a; // 継承 │ int c; │ static int d; │ │ サブクラス1() { } // コンストラクタは継承しない、super()で呼び出す │ │ int methodA () { } // 継承 │ int methodC() { } │ static int methodD() { } ↓ サブクラス2 extends サブクラス1 implements サブインタフェース1, サブインタフェース2… ↑ int a; // サブクラス1のフィールドを継承 │ int c; // 継承 │ int e; │ static int f; │ public static final int g; // 実装(サブインタフェース1) │ public static final int h; // 実装 │ │ サブクラス2() { } │ │ int methodA () { } // サブクラス1のメソッドを継承 │ int methodC() { } // 継承 │ int methodE() { } │ static int methodF() { } │ int methodG() { } // 実装(サブインタフェース1) │ int methodH() { } // 実装 │ interface サブインタフェース1 extends スーパインタフェース1... ↑ public static final int h; │ │ public abstract int methodE() { } // 継承 │ public abstract int methodH() { } │ interface スーパーインタフェース public static final int g; public abstract int methodG() { }

    • ベストアンサー
    • Java
  • Javaのアクセス修飾子は4つで足りる?

    Javaに、アクセス修飾子ってあるじゃん。デフォルトも含めて4つだけですけど、これで事足りますか?もう1つ加えて5つにすると、使いやすいかなと個人的に思うのですが。 何を追加したいかというと、「同パッケージ内のサブクラスのみアクセス可」です。何か名前をつけるなら familyです。サブクラスは同パッケージに作ることもあれば別パッケージに作ることもあって、2通り考えられるます。そのうち前者を、スーパークラスと血縁関係のある家族のように特別扱いします。家族の絆があればアクセス可としよう、そんな感じです。 現状の4つは (厳しい) 1.private 2.デフォルト 3.protected 4.public (緩い) 追加するfamilyは、1と2の間に位置します。 privateだと自クラスのみ、家族も排除。 デフォルトだと、同パッケージ内ならサブクラス(家族)に加えそれ以外のクラスもアクセス可、別パッケージからはサブクラスでも排除です。 familyに需要あると思うのですが、ドーかしら? 例えば、同パッケージ内にガンダムclassと鉄腕アトムclassとドラえもんclassを作ります。いずれもロボットですから、その共通点を抽出したロボットclassを作っておいて、後からそれをextendsで継承し、差分だけプログラミングします。こういうとき、カプセル化とかbeanの方針でロボットclassのフィールドにはprivateを付けたいところですが、それ付けちゃうと継承するときにsetterもgetterも機能しません。 かといって、privateをデフォルトやprotectedに変えると、緩すぎだと思う。familyがちょうど良いと思う。

専門家に質問してみよう