• ベストアンサー

修飾子 private protected

Java での話です。 自分自身とサブクラスからのみアクセスできる変数は作成することはできないのでしょうか。修飾子 private protected の組み合わせは廃止されたようなのですが。 C++ だと、protectedで良かったと思うのですが、Java では同一パッケージからアクセスできるので戸惑ってしまいました。

  • Java
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • osumitan
  • ベストアンサー率33% (102/307)
回答No.2

1です。 > やはりないのですか。同じことをしたい場合にはどうするのでしょう? > 面倒でもそれぞれのサブクラスでprivateで宣言するのでしょうか。 同じことはできないと思います。 それぞれのサブクラスでprivate宣言では継承になってないですし、よくないでしょう。 自分は仕方ないのでprotectedにして同一パッケージから見えてしまうのはあきらめていますが。 普通なら同一パッケージ内はすべて自分たちで書くのだから見えてしまっても呼ばなきゃいいか、で済むのかもしれませんが、 できれば言語使用にこのスコープが追加されるといいなーと思ってます。

gfdffe
質問者

お礼

再度のご回答、どうもありがとうございます。 > protectedにして同一パッケージから見えてしまうのはあきらめて 私もそうすることにします!

その他の回答 (1)

  • osumitan
  • ベストアンサー率33% (102/307)
回答No.1

Javaにはないですね。 自分もほしいと思っていますが。 C#でいうinternalですか。

gfdffe
質問者

お礼

ご回答ありがとうございました。 やはりないのですか。同じことをしたい場合にはどうするのでしょう? 面倒でもそれぞれのサブクラスでprivateで宣言するのでしょうか。

関連するQ&A

  • アクセス修飾子

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

  • 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がちょうど良いと思う。

  • protectedについて

    メソッドの前につけるprotectedについてなんですが 具体的にどこまでアクセスを許可するのでしょうか? 調べたところサブクラスと同じクラス内はいけるようですが 同じパッケージ内ではだめなのでしょうか?

    • ベストアンサー
    • Java
  • protectedメソッドが使用できる範囲

    protectedメソッド(もしくはコンストラクタ)はサブクラスからであればアクセスできると覚えていたのですが、以下のような使い方だとサブクラスから見えなくなるようです。 サブクラスでも別パッケージからは参照できないのでしょうか。 ------------------------- package sample.a; import sample.b.*; public class Main2 { public Main2() { } protected Main2(int a){ }     protected void hoge(){ } } -------------------------- package sample.b; public class Main extends Main2{ public void hoge(){ Main2 m2 = new Main2(1);//ここでエラー m2.hoge(); //この使い方もエラー } } -------------------------------

    • ベストアンサー
    • Java
  • PHPでサブクラスからスーパクラスのprivate

    メンバにアクセスできる件について PHPでスーパークラスで定義したprivateのメンバにサブクラスからアクセスできる件について 質問です。 class TestClass { private $value01 = "スーパークラスの private メンバ"; public function testMethod01 () { print "スーパークラスのパブリックメソッド"; print "<h1>{$this->value01}</h1>"; } protected function testMethod02(){ print "スーパークラスの protected メソッド"; } private function testMethod03(){ print "スーパークラスの private メソッド"; } public function getMethodList(){ print_r(get_class_methods($this)); } } class ExClass extends TestClass{ private $value01 = "サブクラスの private メンバ"; } $obj = new ExClass(); $obj-> testMethod01(); と上記のようにサブクラスのインスタンスから継承したpublicなメソッド testMethod01()を実行すると スーパークラスのprivateなプロパティにアクセスできてしまいます。 これってどういうことでしょうか?privateメンバってそのクラスの中からだけしかアクセスできませんよね? 上記では、サブクラスからアクセスしているような状態にみえますがどういうことでしょうか? ご教授御願い致します。

    • ベストアンサー
    • PHP
  • PHPのprivate関数について

    PHPのアクセス修飾子privateについてお聞きします。 以下のようなコードを書いて実行したら、エラーメッセージが出ました。 code: <?php class Super { protected function protectedFunc(){ echo "original-Protected\n\r"; } private function privateFunc(){ echo "Private\n\r"; } public function publicFunc(){ privateFunc(); } } $super = new Super; $super->publicFunc(); ?> error message: Fatal error: Uncaught Error: Call to undefined function privateFunc() in C:\xampp\htdocs\HTML_practice\protected-practice.php:12 Stack trace: #0 C:\xampp\htdocs\HTML_practice\protected-practice.php(17): Super->publicFunc() #1 {main} thrown in C:\xampp\htdocs\HTML_practice\protected-practice.php on line 12 line12 というのは、public 関数であるpublicFunc() の内側で、private関数のprivateFunc() を使おうとした部分ですが、private関数はクラス定義の中だから使えるというのは間違った認識でしょうか? だとするとprivate関数はいつどんな時に使えるのでしょうか? どなたか例を挙げて説明頂けないでしょうか? 宜しくお願いいたします。

    • ベストアンサー
    • PHP
  • 修飾子 public

    表題について、今日ふと疑問に思ったことがありますのでどなたか回答お願いいたします。 Javaに限らず、C#等でも修飾子にpublicやprivateがあり参照が制限できるしくみで、当たり前の ように使い分けてきましたが、全て【public】でいいんじゃないかとふと思ってしまいました。 このpublicとprivateの使い分けは、システムが大きくなった場合に参照できるメソッド数が 増えてわかりにくくならないように分けているだけなのでしょうか?? 逆に小さなシステムで自分で把握していれば全てpublicでもよいのでしょうか?? 現在の僕の手法ではとりあえずprivateで宣言して、publicに使いたくなったらpublicに昇格する ような決め方をしています。こんな決め方でよいでしょうか?? へんな質問ばっかりで申し訳ございません。 今後の参考のためにみなさんの意見をお聞かせください。

  • publicがprotectedになった場合のプログラム修正

    JDK1.4から1.3にバージョンを落とす事になったのですが、java.util.Calendar.getTimeInMillisが publicでなくprotectedでした。 http://java.sun.com/j2se/1.3/ja/docs/ja/api/java/util/Calendar.html#getTimeInMillis() したがって、他のパッケージからのアクセスできなくなってしまったのですが、こういう場合どのように対処すれば良いでしょうか?

    • ベストアンサー
    • Java
  • クラス修飾子やアクセス修飾子を省略したパッケージ・プライベートは同じフォルダの下層フォルダにも公開するのですか?

     クラス修飾子やアクセス修飾子を省略したパッケージ・プライベートは同じフォルダの下層フォルダにも公開するのですか?  publicなどのクラス修飾子やアクセス修飾子を省略すると、同じフォルダ内のクラスにだけ公開されているパッケージ・プライベートなクラスなど(変数、メソッドとかのメンバを含む)になる、とのことですが、これは同じフォルダだけでなく同じフォルダの下層フォルダにも公開するのですか?  フォルダはパッケージのことです。 Windowsユーザーに分かりやすい言い方で記述しました。  よろしくお願いいたします。

    • ベストアンサー
    • Java
  • C++ protectedにアクセス不可

    C++でお聞きしたいことがあります。 初心者ですのでご容赦ください。 //基本クラス class a1 { protected: a1(); }; //派生クラス class a2 :public a1 { protected: a2():a1(){}; //継承先以外から作成されたくない int t; }; class a3 : public a2 //a2を継承 { public: a3(); ~a3(); private: a2* a; //a2のポインタを持つ }; a3::a3() { t = 3; a = new a2; //コンストラクタの中でnew } a3::~a3() { delete a; //終わったらdelete } int main(void) { a3 a; return 0; } というソースでa3はa2を継承しています。 ですのでa2のprotectedメンバtにアクセスできるはず。 ここまではいいのですが、 a2のコンストラクタもa3でアクセスでき無いのでしょうか? a3のコンストラクタでnewしようとすると error C2248: 'a2::a2' : protected メンバ (クラス 'a2' で宣言されている)にアクセスできません。 a2::a2' の宣言を確認してください。 というエラーが発生します。 やりたいのはa2のような基本クラスが6つほどあり、 a2のメンバ変数が多いので コンストラクタの引数で指定されたものだけ コンストラクタないでnewしたいのです。 なぜ、できないのか? どうすればnewできるようになるのか…。 非常にお手数ですが、 どなたかご回答いただけませんでしょうか? 長文になりましたが、宜しくお願いいたします。

専門家に質問してみよう