![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
お世話になります。
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メンバにする理由は何かあるのでしょうか?
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の有無は気にしなくてよい」です。
No.3
- 回答日時:
へたなたとえ話で恐縮ですが、トランプの7並べを取り上げます。
・ 普通のカードは、一般市民。
・ ジョーカーは、 特権階級。
・ 一般市民は、法律に従えば(順序と種類があえば)カードを並べることが出来ます。
・ 何処にでもと言うわけではないけど、ジョーカーは1つ跳んだ場所にカードを並べることを可能にします。
・ ゲームの厳密な規定とは外れますが、法律に従えば一般市民でもできるのに、どうしてわざわざ特権階級を持ち出すの。
・ そうですね、でもジョーカーの存在意義はなくなりませんね。
>>> 今回このコード上publicメンバにする理由は何かあるのでしょうか?
特にありません。あえて言えばJavaの勉強のためです。
これからJavaをマスタして行こうという方が最初に戸惑うところでしょう。
それも当然で、gbgbさんが****で説明されている通りなのですが一度読んでも簡単には飲み込むことは出来ないでしょう。それなりに込み入っておりパッケージやサブクラスなどの新しい概念が入っています。
さらにこれらは、メソッドだけでなくクラスにも適用されかつ微妙に違いがあります。
もし今後多くのプログラミングをすることになれば、クラス名のバッティングをふせぐためには分類してパッケージ管理が必要だとか、プログラムの再利用にはサブクラスの利用が重要だということがわかってくると思います。そのときのためのものです。
ことは複雑ですから、今回の問題を解決するにあたって次の2点の理解を同時に深めていくよいでしょう。
-------------------------------------------------------------------------------
パッケージ
-------------------------------------------------------------------------------
クラス、継承、サブクラス
-------------------------------------------------------------------------------
最後に気になることがありますので述べさせていだきます(私の理解不足でなければいいのですが)。
・ANo.1に述べられている
>>> 2つに分けると、実行ファイル作製時に「Main2.cppで外部参照されているAAとshowが見付かりません」とエラーになります。
は、エラーにならないと思います。
ANo.2にあるように、「同じパッケージに属するクラス」からは何も付けていない場合アクセス出来るからです。
No.2
- 回答日時:
メソッドやフィールド変数に付与する修飾子の定義は以下の通りです。
* private...自分自身が含まれるクラス内からしかアクセスできない
* protected...同じパッケージ及び継承するサブクラスからしかアクセスできない。
* public...全ての場所からアクセス可能。
* デフォルト・アクセス...同じパッケージに属するクラス内からしかアクセスできない。
publicは『どこからでもアクセス可能』という意味の修飾子です。上記ソースであれば、オブジェクト内のフィールドの状態を隠匿するためです(変な値を設定しようとしても、メソッド内のコードで止めることが出来る)
参考URL:http://www.nextindex.net/java/modify.html
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- Java java final 1 2022/06/10 22:49
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- Java 直し方について教えて頂きたいです。 4 2022/08/13 02:11
- C言語・C++・C# Windows Formアプリからコンソールを呼び出して文字を出力させたい 8 2023/05/09 10:53
- Java eclipse実行ができない 2 2022/07/27 04:47
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
関数内の変数に<summary>コメン...
-
クラス間でのデータ参照
-
内部クラスから別の内部クラス...
-
SwingでgetContentPaneのエラー...
-
無名パッケージからのインポート
-
Eclipseを用いたJARファイル作...
-
javaの配列について質問です。
-
Java リフレクションについて
-
C#でほかのファイルにある自作...
-
dynamic_castの必要性
-
C# 子->親の通知にBeginInvoke...
-
継承したクラス側のクラス名の取得
-
C# インターフェイスの実装
-
super.paint(g)を呼び出す意...
-
JSPでbeanプロパティ(配列)を...
-
型Containerのメソッドadd(S...
-
アップキャスト、ダウンキャス...
-
dllエクスポート時のdeclspec(d...
-
範囲外の数値を代入したらエラ...
-
c++,ある関数のクラスから別の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
クラス間でのデータ参照
-
範囲外の数値を代入したらエラ...
-
関数内の変数に<summary>コメン...
-
c++,ある関数のクラスから別の...
-
C#にて別クラスの関数を使いたい
-
java-別クラスの変数の使い方を...
-
C++でfriendクラスにしているの...
-
a href="..." とServlet
-
親クラスから子クラスへアクセス。
-
構造 他のクラスの構造体を別...
-
Java リフレクションについて
-
import と extends について
-
C#でほかのファイルにある自作...
-
C#のクラスライブラリでメッセ...
-
Java
-
アップキャスト、ダウンキャス...
-
無名パッケージからのインポート
-
違うクラスからの変数の共有化
-
SwingでgetContentPaneのエラー...
-
ひとつのファイルにクラスは1つ?
おすすめ情報