- ベストアンサー
Publicとは?
お世話になります。 class A{ private int a; private int b; public void AA( int m, int n){ if( m > 0 && n > 0) a = m; b = n; } public void show(){ System.out.println( a + " " + b); } } public class B{ public static void main(String args[]){ A x = new A(); //x.a = 10; x.b = 20;は不可 x.AA(10, 20); x.show(); } } 上記のコードで、privateフィールドにはクラス外からアクセスは出来ないのは理解できます。 が、そこでpublic付きのメンバAAなりshowなりを用いて、フィールドに値を設定しているのですが、試しにこのpublicを外した場合実行されたのですが、今回このコード上publicメンバにする理由は何かあるのでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
publicとは「外部参照を許す」と言う意味があります。 「外部参照を許す」とは「別のソースコードから参照出来る」と言う意味です。 >試しにこのpublicを外した場合実行されたのですが、今回このコード上publicメンバにする理由は何かあるのでしょうか? piblicを外すと「外部参照は許されず、同一ソースコード(ソースファイル)内の他クラスからは参照可能」になります。 なので「今回のこのコードは、定義されている(つまり、実体がある)ソースコードと、呼び出し(参照)を行っている部分のソースコードが、同一のソースコードにあるので、publicを付けても付けなくても実行出来る」のです。 つまり、 =======Main1.cpp======= class A{ void AA( int m, int n){(略 void show(){(略 (略 public class B{ public static void main(String args[]){ A x = new A(); (略 x.AA(10, 20); x.show(); ======================= はコンパイルが通るけど、ソースコードを =======Main1.cpp======= class A{ void AA( int m, int n){(略 void show(){(略 (略 ======================= と =======Main2.cpp======= public class B{ public static void main(String args[]){ A x = new A(); (略 x.AA(10, 20); x.show(); ======================= の2つに分けると、実行ファイル作製時に「Main2.cppで外部参照されているAAとshowが見付かりません」とエラーになります。 ぶっちゃけ「全部1本のソースコードで書いてる時は、publicの有無は気にしなくてよい」です。
その他の回答 (2)
- auty
- ベストアンサー率58% (284/486)
へたなたとえ話で恐縮ですが、トランプの7並べを取り上げます。 ・ 普通のカードは、一般市民。 ・ ジョーカーは、 特権階級。 ・ 一般市民は、法律に従えば(順序と種類があえば)カードを並べることが出来ます。 ・ 何処にでもと言うわけではないけど、ジョーカーは1つ跳んだ場所にカードを並べることを可能にします。 ・ ゲームの厳密な規定とは外れますが、法律に従えば一般市民でもできるのに、どうしてわざわざ特権階級を持ち出すの。 ・ そうですね、でもジョーカーの存在意義はなくなりませんね。 >>> 今回このコード上publicメンバにする理由は何かあるのでしょうか? 特にありません。あえて言えばJavaの勉強のためです。 これからJavaをマスタして行こうという方が最初に戸惑うところでしょう。 それも当然で、gbgbさんが****で説明されている通りなのですが一度読んでも簡単には飲み込むことは出来ないでしょう。それなりに込み入っておりパッケージやサブクラスなどの新しい概念が入っています。 さらにこれらは、メソッドだけでなくクラスにも適用されかつ微妙に違いがあります。 もし今後多くのプログラミングをすることになれば、クラス名のバッティングをふせぐためには分類してパッケージ管理が必要だとか、プログラムの再利用にはサブクラスの利用が重要だということがわかってくると思います。そのときのためのものです。 ことは複雑ですから、今回の問題を解決するにあたって次の2点の理解を同時に深めていくよいでしょう。 ------------------------------------------------------------------------------- パッケージ ------------------------------------------------------------------------------- クラス、継承、サブクラス ------------------------------------------------------------------------------- 最後に気になることがありますので述べさせていだきます(私の理解不足でなければいいのですが)。 ・ANo.1に述べられている >>> 2つに分けると、実行ファイル作製時に「Main2.cppで外部参照されているAAとshowが見付かりません」とエラーになります。 は、エラーにならないと思います。 ANo.2にあるように、「同じパッケージに属するクラス」からは何も付けていない場合アクセス出来るからです。
- bgbg
- ベストアンサー率53% (94/175)
メソッドやフィールド変数に付与する修飾子の定義は以下の通りです。 * private...自分自身が含まれるクラス内からしかアクセスできない * protected...同じパッケージ及び継承するサブクラスからしかアクセスできない。 * public...全ての場所からアクセス可能。 * デフォルト・アクセス...同じパッケージに属するクラス内からしかアクセスできない。 publicは『どこからでもアクセス可能』という意味の修飾子です。上記ソースであれば、オブジェクト内のフィールドの状態を隠匿するためです(変な値を設定しようとしても、メソッド内のコードで止めることが出来る)
お礼
御回答下さり、ありがとうございます。 何となく、Cの分割コンパイルみたいなことなのかと思いました。