• ベストアンサー

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メンバにする理由は何かあるのでしょうか?

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

  • ベストアンサー
  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.1

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の有無は気にしなくてよい」です。

sikimori
質問者

お礼

御回答下さり、ありがとうございます。 何となく、Cの分割コンパイルみたいなことなのかと思いました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • auty
  • ベストアンサー率58% (284/486)
回答No.3

へたなたとえ話で恐縮ですが、トランプの7並べを取り上げます。 ・ 普通のカードは、一般市民。 ・ ジョーカーは、 特権階級。 ・ 一般市民は、法律に従えば(順序と種類があえば)カードを並べることが出来ます。 ・ 何処にでもと言うわけではないけど、ジョーカーは1つ跳んだ場所にカードを並べることを可能にします。 ・ ゲームの厳密な規定とは外れますが、法律に従えば一般市民でもできるのに、どうしてわざわざ特権階級を持ち出すの。 ・ そうですね、でもジョーカーの存在意義はなくなりませんね。 >>> 今回このコード上publicメンバにする理由は何かあるのでしょうか? 特にありません。あえて言えばJavaの勉強のためです。 これからJavaをマスタして行こうという方が最初に戸惑うところでしょう。 それも当然で、gbgbさんが****で説明されている通りなのですが一度読んでも簡単には飲み込むことは出来ないでしょう。それなりに込み入っておりパッケージやサブクラスなどの新しい概念が入っています。 さらにこれらは、メソッドだけでなくクラスにも適用されかつ微妙に違いがあります。 もし今後多くのプログラミングをすることになれば、クラス名のバッティングをふせぐためには分類してパッケージ管理が必要だとか、プログラムの再利用にはサブクラスの利用が重要だということがわかってくると思います。そのときのためのものです。 ことは複雑ですから、今回の問題を解決するにあたって次の2点の理解を同時に深めていくよいでしょう。 -------------------------------------------------------------------------------    パッケージ -------------------------------------------------------------------------------    クラス、継承、サブクラス ------------------------------------------------------------------------------- 最後に気になることがありますので述べさせていだきます(私の理解不足でなければいいのですが)。 ・ANo.1に述べられている     >>> 2つに分けると、実行ファイル作製時に「Main2.cppで外部参照されているAAとshowが見付かりません」とエラーになります。  は、エラーにならないと思います。  ANo.2にあるように、「同じパッケージに属するクラス」からは何も付けていない場合アクセス出来るからです。

全文を見る
すると、全ての回答が全文表示されます。
  • bgbg
  • ベストアンサー率53% (94/175)
回答No.2

メソッドやフィールド変数に付与する修飾子の定義は以下の通りです。 * private...自分自身が含まれるクラス内からしかアクセスできない * protected...同じパッケージ及び継承するサブクラスからしかアクセスできない。 * public...全ての場所からアクセス可能。 * デフォルト・アクセス...同じパッケージに属するクラス内からしかアクセスできない。 publicは『どこからでもアクセス可能』という意味の修飾子です。上記ソースであれば、オブジェクト内のフィールドの状態を隠匿するためです(変な値を設定しようとしても、メソッド内のコードで止めることが出来る)

参考URL:
http://www.nextindex.net/java/modify.html
全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 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; } }; コードは違いますがこんな感じのことをしたいのです。 /* コンソールで小さなプログラムでテストしてみると動くのにいざ実際のソースに組み込むと動かないという奇妙な状態です。よろしくお願いします。 */

  • クラスの設計の問題

    今C++でクラスの設計をしています。 どう設計すれば、いいか分からないので、しっている方に教えていただきたいですが。 class A{ private: int id; public: int getId(); void setId(); }; class B{ private: int id; public: int getId(); void setId(); } class C{ private: int id; public: int getId(); void setId(); } この三つのクラスが、共通な機能があります。また、実装も同じで、 継承を利用して、どう設計すれば、いいですか? よろしくお願いします。

  • C++のプログラムが走りません。

    <<条件は以下です。>> データメンバ x:xの座標(ただし 0-1000とする) y:yの座標(ただし 0-1000とする) z:zの座標(ただし 0-1000とする) メンバ関数 void setX(int a): xの座標を設計する(範囲外の値は、error messageを出力する) void setY(int b): Yの座標を設計する(範囲外の値は、error messageを出力する) void setZ(int c) Zの座標を設計する(範囲外の値は、error messageを出力する) int getX(): Xの座標値を得る int getY(): Yの座標値を得る int getZ(): Zの座標値を得る << 不明な点は、 if文で、どう戻るかがわからないことと、 最後の結果表示の部分です。 以下が、作成したプログラムです。ネットで検索して類似しているプログラムを参考にしたんですが。 よろしくお願いします。>> #include <iostream> using namespace std; class Zahyou{ private: int getX();//Xの座標値を得る int getY();//Yの座標値を得る int getZ();//Zの座標値を得る int a,b,c; public: void setX(int a);//Xの座標を設計する void setY(int b);//Yの座標を設計する void setZ(int c);//Zの座標を設計する void show(); }; void Zahyou::show(){ cout << "The result is: (" << a << "," << b << "," << c << ")"; } void Zahyou::setX(int a){ cout << " Please Input X " << "\n "; cin >> a ; if(a < 0 && a > 1000){ cout << "The value of X is a mistake, Please input X again! " << " \n "; } } void Zahyou::setY(int b){ cout << "Please Input Y " << "\n "; cin >> b ; if(b < 0 && b > 1000){ cout << "The value of y is a mistake, Please input X again! " << " \n "; cin >> b ; } } void Zahyou::setZ(int c){ cout << " Please Input Z " << "\n "; cin >> c ; if(c < 0 && c > 1000){ cout << "The value of Z is a mistake, Please input X again! " << " \n "; cin >> c ; } } int main(){ Zahyou zahyou1; zahyou1.getX(); zahyou1.getY(); zahyou1.getZ(); zahyou1.show(); return 0; }

  • C++ クラスをメンバにもつクラスについて

    お世話になります。C++初心者でうまくコードが書けません(><) クラス1と2があり、クラス1のメンバにはクラス2があります。 メインでクラス1をインスタンス化してクラス2のfunc2を呼び出します。 func2ではクラス1のインスタンスから呼び出された場合にクラス1の m_int1を取得します。 Class Class1{ public:  int m_int1;  Class2 m_Class2; }; Class Class2{ public: void func2(); }; void Class2::func2(){  /*ここの記述方法が分かりません*/  /*C1から呼び出されたらC1のm_int1に100を入れる*/  /*以下間違え*/  class1 C2_1;/*別のclass1のオブジェクトなのでこれに入れてもダメっぽい*/  C2_1.m_int1 = 100; } void main(){  class1 C1;  C1.m_int1 = 10;  C1.m_class2.func(); } C1.m_class2.func()の中から呼び出したC1にアクセスする方法が 分かりません(TT)。実体がまだあるのだからアクセスする方法は あると思うのですが・・・ どなたかよろしくお願いします。

  • サブクラスでセッターを呼び出す

    java初心者です。 以下のようなソースコードで、コンパイルしたらエラーが出ました。 サブクラスのsetterのところでエラーが出たんですが、 サブクラスでスーパークラスのメソッドは呼び出せないんでしょうか? それとも他に間違いがあるんでしょうか? class rensyu { private int x; rensyu(){ x=this.x; } int getX(){ return x; } void setX(int m){ this.x = m; } } class rensyu2 extends rensyu{ private rensyu[] A; rensyu2(){ A = new rensyu[100]; } int getter(int i){ return A[i].getX(); } void setter(int x,int i){ A[i].setX(x); } } class rensyuTester{ public static void main(String[] args) { rensyu2 A = new rensyu2(); A.setter(1,0); A.setter(2,1); System.out.println(A.getter(0) +" "+ A.getter(1)); } }

    • ベストアンサー
    • Java
  • フレンドクラスにできない

    mediatorクラスからCOuterクラスのメンバ変数にアクセスできるようにフレンドクラスにしたつもりなんですが、 うまくアクセスができずコンパイルエラーになってしまいます。 どこが悪いのか分からず困っています。 どなたか助けていただけませんか? mediator.h ----------------------------------------------------- template <class T> class mediator { public: mediator(T* p=NULL) : m_p(p) {} void SetOutClass(T*p) { m_p = pT;} T& GetOutClass() const { return *m_p;} private: T* m_p; }; #define outer GetOutClass() ----------------------------------------------------- COuter.h ----------------------------------------------------- class COuter { private: int m_a; public: void func() { class CInner : public mediator<COuter> { public: CInner(COuter *p) : mediator<COuter>(p) {} void func() { // フレンドクラスなのにアクセスできない!? outer.m_a = 1; } }; CInner inner(this); inner.func(); } friend class mediator<COuter>; }; -----------------------------------------------------

  • 関数ポインタにvirtual関数を与えたいです

    //関数ポインタについて質問させてください。 //error C2440: '=' : 'void (__thiscall A::* )(int,int)' から 'void (__cdecl *)(int,int)' に変換できません。 //というエラーが出ます。 //どうすればいいのか教えてください。 //よろしくお願いします。 #include<stdio.h> class A { public: void (*aaa)(int a,int b); virtual void test(int a,int b)=0; virtual void test2(int a,int b)=0; void execute() { aaa=test;//error C2440 } }; class B : public A { public: void test(int a,int b) { printf("test"); } void test2(int a,int b) { printf("test2"); } }; int main() { B b; b.execute(); b.aaa(2,3); return 0; }

  • C#で参照

    C#で参照 こんにちは。 例えば、C++で class A { int &x; public: A(int &_x):x(_x){} public: void disp() { std::cout<<x<<std::endl; } }; void func() { int x=100; A a(x); a.disp(); x=200; a.disp(); } とすると、a.xとxとを連動させることができますが、同様のことをC#で行うにはどうすればよいのでしょうか? int x=100; の定義を変えずに行うことは可能でしょうか? よろしくお願いします。

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

    アクセス修飾子の指定相手と、そのスコープとの関係性。 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
  • C# 関数はどこに書くの?

    c#を始めました。 関数はどこに書けばよいのだろうと思い以下の2つのパターンを書きました。どちらも実行するとちゃんと動いています。 どちらの書き方が正しいのでしょうか?よろしくお願いいたします。 パターン1 public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { int a=3; int n= tasu(a); MessageBox.Show(n.ToString());   //ここに関数を書く int tasu(int a10) { return a10 - 2; } } } パターン2 public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { int a=3; int n= tasu(a); MessageBox.Show(n.ToString()); }   //ここに関数を書く int tasu(int a20) { return a20 -1; } }