• ベストアンサー

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

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

noname#179638
noname#179638
  • Java
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
noname#49664
noname#49664
回答No.1

>クラス修飾子やアクセス修飾子を省略したパッケージ・プライベートは同じフォルダの下層フォルダにも公開するのですか? 要するに、サブパッケージに対してもpublicか、ということですね。例えば、jp.hogeパッケージにあるパッケージプライベートなクラスは、jp.hoge.hogeパッケージ内のクラスに対してもpublicか?ということでしょうか。 これは「NO」です。パッケージプライベートは、文字通り「同一パッケージに対してのみpublic」です。サブパッケージは別のパッケージですからpublicではありません。 よく、継承などとごっちゃになってしまうのですが、パッケージには基本的に「階層に警鐘的な意味合いはない」と考えるべきです。jp.hogeとjp.hoge.hogeの間には、意味的な関係はありません。つまり、jp.hoge.hogeの中には、jp.hogeとはまったく無関係なクラスが入っていても別にかまわないのです。継承のサブクラスなどのように、何らかの関連があるわけではまったくありません。パッケージとしては、「まったく別のもの」でしかないわけです。 したがって、Javaでは「同一パッケージおよびサブパッケージ」のみをpublicにするアクセス修飾はない、ということです。

noname#179638
質問者

お礼

 Kyon2_PaPaさま、ご回答ありがとうございました。 >パッケージには基本的に「階層に警鐘的な意味合いはない」と考えるべき いままでよく分かりませんでしたけど、import文が階層をたどらないのもうなづけます。 import java.awt.*; import java.awt.event.*; のように。

関連するQ&A

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

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

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

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

  • アクセス修飾子

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

  • 親クラスのメソッドを別のパッケージの子クラスでオーバーライドするときについて

    早速ではございますが、質問をさせていただきます。 親クラスのパッケージとは異なるパッケージに子クラスが あるとき、子クラスが親クラスのメソッドをオーバーライ ドするときに、親クラスのメソッドのアクセス修飾子を publicかprotectedにしなければコンパイルエラーになり ます。それはなぜなのでしょうか? どうかご教授のほどよろしくお願いします。

    • ベストアンサー
    • Java
  • C# メソッドのアクセス修飾子について

    以下のような宣言の仕方は可能でしょうか? class Test { public void method() { } } classのデフォルトのアクセス修飾子はinternalになるかと思うのですが、その場合メソッドの修飾子にpublicが指定できるのかという質問です。

  • プライベートフォルダのアクセス権を復帰させるには?

    Windows XP Proを使っていまして、 異常があったために、再インストールしました。 そうすると、以前設定していたプライベートフォルダに 同じユーザ名でもフォルダを開こうとすると、 アクセスを拒否されます。 Administratorでもログインしてそのフォルダにアクセスしてみましたが、 「そのフォルダへのアクセスは拒否されました」 (このメッセージはどのユーザでも同じでした) と表示されます。 ネットワークへはワークグループを使用しています。 [共有とセキュリティ]の[プライベートフォルダにする]の チェックボックスは変更できない状態でした。 フォルダの中を見られる方法はないでしょうか? よろしくお願いします。

  • パッケージ間のアクセスが分かりません。

    インプレスジャパン「JavaSE7 Silver問題集 P13 問5」より (ファイル1) public class Sample{ protected int num = 10; } (ファイル2) package ex5; public class SampleImpl extends Sample{ public static void main(String[] args){ System.out.println(num); } } ファイル2をコンパルしようとすると、 「エラー: シンボルを見つけられません」とメッセージが表示されます。 SampleとSampleImplクラスは別々のパッケージに属していますが、 変数numはprotectedで修飾されているので、アクセス出来るように 思うのですが、どこが間違っているのでしょうか? 解説には「明示的にパッケージ宣言したクラスから、無名パッケージに 属するクラスにアクセスしようとするとコンパイルエラーになります。」と ありますが、無名パッケージもパッケージの一つであり、 かつ、この2つのクラス間には継承関係もあります。 よろしくお願い致します。

    • ベストアンサー
    • Java
  • アクセス修飾子の指定相手と、そのスコープとの関係性。

    アクセス修飾子の指定相手と、そのスコープとの関係性。 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
  • パッケージ化されたクラスより変数を読む

    パッケージ宣言されたクラスから配列変数を読み出す場合、どのように記述すればいいのでしょうか。 ファイル名 Pack.java パッケージ名 package firstPack; クラス定義 public class Pack {   String [] test = {"あ","い","う","え","お"} } ↑これを、TestPack.java から test の内容を 呼び出す場合。よろしくお願いします。

    • ベストアンサー
    • Java
  • C++でfriendクラスにしているのにprivateメンバにアクセスできない

    C++でメンバ変数をprivateにして、特定のクラスにだけ公開するようにクラスをfriend指定したのですがprivateメンバにアクセスできませんとエラーが吐かれてしまいます。 先行宣言したりもしてみたのですがどうしても使用できません。 何か心当たりのあるかた教えてください。 class A { friend class B; private: int a; }; class B { public: void test( A *a ) { a->a = 0; } }; コードは違いますがこんな感じのことをしたいのです。 /* コンソールで小さなプログラムでテストしてみると動くのにいざ実際のソースに組み込むと動かないという奇妙な状態です。よろしくお願いします。 */

専門家に質問してみよう