• 締切済み

javaのprivateって?

privateの必要性がいまいちわからなくて困ってます。 class Car{ private int num; private double gas; public void setNumGas(int n, double g){ num=n; gas=g; ・・・・・・・ このようなプログラムがあります。 変数をprivateにして、下のメソッドでnの値をnumに格納してします。 ここで変数をprivateにする意味ってあるんですか? 本には、勝手な値(-10など)を代入させないためと書いてあります。 これっておかしくないですか? 変数をprivateにしてもメソッドに「-10」を引数として渡したら余裕で格納できるじゃないですか。 代入させないためと書いてあるのに格納できるって・・・・矛盾してるような気がします。 ここでprivateにする意味がわかりません。 誰か教えてください。

noname#53923
noname#53923
  • Java
  • 回答数6
  • ありがとう数2

みんなの回答

回答No.6

ほかの皆さんのアドバイスとほぼ同じですが、要するに、とても大切なデータにはprivateをつけるってところでしょうか。 class sample{   // 消費税の変更を許可するかどうかのフラグ変数   private boolean allow = false;   // 消費税   private int tax = 0.05;      public void changeAllow(int yes){      // 引数の値が1ならallowをtrueに変更      if(yes == 1){        allow = true;      }else{        allow = false;      }   }     public void changeTax(int new_tax){     // allow(許可)変数がtrueなら新しい消費税を設定     if(allow == true){      tax = new_tax;     }else{      System.err.println("消費税の変更は許可されません。");     }   } } 上のサンプルでは、消費税という変数をプライベートにしています。実生活で考えてみてください。たとえば、allow(消費税の変更許可を制御)という変数は財務省しか操作できない重要な値です。一般人(public)が勝手に許可できないですよね?だから、privateにしておいてメソッドでチェックします。 そして同じくtax(消費税)というのも、勝手に変えては経済が混乱します。なので、allowがtrueになった場合、つまり財務省が許可した場合のみ変更を許可します。どうでしょう。お分かりになったでしょうか。自分も習いたてのころはprivateの必要性には頭を抱えました。でも、とても重要な概念ですのでがんばって理解してくださいね。

回答No.5

privateとは以下のような概念です。 Aさんはprivateな変数moneyを持って、それをセットするメソッドを用意しています。 class A { private int money; public void setMoney(int money) { this.money=money; } } Bさんはpublic な変数moneyを持っています。 class B { public int money; } Aさんはお金を金庫か何かに入れてきちんと管理している。Bさんはお金を家の玄関の前において管理しているようなイメージです。 AさんもBさんも1千万円持っていたとします。 a.money=10000000; b.money=10000000; ここで、あるXさんが、AさんとBさんのmoneyを奪おうとします。すると、Bさんの変数moneyはpublicなので、Xさんが好きなように使うことができます。 b.money=0; だろうが、 b.money=-10000000; だろうが、Xさんは自由に操作できるわけです。 しかし、Aさんの変数moneyはprivateなので、Xさんが好きなように使うことはできません。(クラスXでa.moneyを書くとコンパイルエラー)つまり、一度AさんのsetMoneyメソッドにお伺いをたてることになります。しかし、AさんのsetMoneyメソッドが今のままだったら、今質問者さんが考えているようにbさんのそれとあまり違いはありません。しかし、AさんのsetMoneyメソッドが public void setMoney(int money) { if(money>this.money) this.money=money; } というメソッドだったらどうでしょう?XさんはAさんのmoneyを増やすことはできても減らすことはできないのです。(引数が現在の値より大きいときにはじめてセットできるようになるから) 変数をprivateにしてセッターゲッターを用意しておくことにより、このような効果を簡単にもたらすことができます。これが「勝手な値を代入させない」と言う意味です。 お金を金庫に入れて管理するか、玄関の前において管理するか。どちらを使っても文法的には問題ないのですが、Javaではお金を金庫に入れて管理する方法の方が推奨されています。

回答No.4

privateでない変数は、他のクラスから直接値を格納できます。 例えば以下のようなクラスが有ったとします。 public class A{ int num; public void setNumGas(int n){      } } 例えばの話ですが、このclass A の変数 num には マイナスの値を格納したくないとします。 しかし、この変数 num は別のクラスから 以下のようにして値を格納できます。 public class B{ public static void main(String[] args){ A a =new A(); a.num = -10; } } この方法で値が格納されると、格納された値はマイナスなのか プラスなのかが分からないまま、値が格納されてしまいます。 そこで class A の変数 num を以下のようにします。 class A{ private int num; public void setNumGas(int n, double g){      } } これでもう先ほどのような方法で変数numには値を格納できません。 他のクラスが変数 num に値を格納するためには class A に 以下のようなメソッドを用意してあげるしかありません。 public void setNumGas(int n){       num = n;      } 変数 num に値を格納するときには必ずこのメソッドを 通らないといけなくなったので、このメソッドに 「これから変数 num に格納する値はマイナスなのか プラスなのか確認」するプログラムを書けば 変数 num に勝手な値を入れられる心配はありません。 class A も class B も同じ人が書くのであれば privateを使わなくても変数 num にマイナスが 入らないよう注意するだけでいいのですが 実際に会社でjavaのプログラムを書く時、class A と class B は 別々の人が書いたりしますので、このほうが安心です。 まあ、変数 num にマイナスが入らないようにチェックする 方法は他にもありますが、この方法が一番スマートな気がします。 なぜなら class B 以外に class A にアクセスするのクラスを 作成したとしても、class A の変数 num に値を格納するためには 必ず「これから変数 num に格納する値はマイナスなのか プラスなのか確認」メソッドを通るようになるからです。

  • neko_noko
  • ベストアンサー率45% (146/319)
回答No.3

>変数をprivateにしてもメソッドに「-10」を引数として渡したら余裕で格納できるじゃないですか。 >代入させないためと書いてあるのに格納できるって・・・・矛盾してるような気がします。 本来、代入させないための処理をsetNumGasに書きます。 ただ、入門書などの場合、そこまで書くとコードが長くなって分かりづらいので省略してあるのでしょう。 こういうsetXXXメソッド(アクセサと言います)を使用しておけば、 numやgasを使用する時にいちいち値が問題ないかをチェックする必要がなくなります。 numやgasがどこで使用されるかなんてのは予測できないし、どれくらい使用されるかも分かりません。 その都度チェックするくらいなら、「入り口」を作っておいてそこで一回チェックし、 ちゃんとした値以外は入らないようにしておく方が効率的で安全です。 また、別の考え方として、入り口の「入り方」をあえていくつか用意するテクニックもあります。 例えば、JavaにはURLをあらわすURLクラスというものがあります。 クラス内で URL url という変数があった場合に setUrl(URL url){ ・・・ } setUrl(String url){ ・・・ } という2つのアクセサを用意しておけば、urlがURL型であろうとString型であろうと、 setUrl(url)を使用すれば値の代入が可能になるわけです。 そのクラスを使う側がいちいち変換しなくても済むわけです。 ※もちろん、setUrl(String url)の中で、String型のurlをURL型に変換する処理を書きます。 どうしてもprivateが使いたくないなら止めはしませんが、 Javaの常識として、クラス変数はprivateとし、メソッドから値を操作する、というのがあります。 なので、作ったクラスを他の人が使用する可能性があれば、その旨は周知させておかないといけません。 「何でわざわざprivateにしておかないの?」と言われるかもしれません。

noname#53923
質問者

補足

すいません。java初心者なので理解に苦しみます。 もっとわかりやすく簡単に説明してください。

  • Bonjin
  • ベストアンサー率43% (418/971)
回答No.2

>本には、勝手な値(-10など)を代入させないためと書いてあります。 >これっておかしくないですか? おかしくないです。提示されたコードでは確かに格納されてしまいますが、適切なコードを加えることでチェックをすることが出来るという意味です。例えば負数がnもgも負の値がダメな時は public void setNumGas(int n, double g){ if(n < 0 || g < 0){ throw new IllegalArgumentException(); } ~省略~ } の様に例外を起こしたりできると言うことです。

noname#39970
noname#39970
回答No.1

じゃぁもし Carの内部仕様が変更されたらどうするの? 今は判るから num や gas を直接参照して class Car x; x.gas=-10; 等と出来るかもしれないけど gas でなく energy に仕様変更されたらどうするの? ソースの全てを書き換えるの? なら x.setNumGas(1,-10) のような方法で使わせ x.gas という使用方法を禁止しておいた方が良いと思わない? 開発者が使うなら構わないけど 別の人がそれを使う場合はどんな内部仕様修正があろうとも x.setNumGas(int,double) でclassを使用できる。

関連するQ&A

  • プログラミングお願いします(JAVA)

    フィールドとして、「ナンバー」「ガソリン残量」「走行距離」「エンジンの排気量」の4つ、それらの値を表示するメソッド4つから構成されるCar2ラスを作成し、メインメソッドで2つのオブジェクトkcar と bcar を作成し、それぞれに、次の値を代入し、Car2ラスのメソッドを呼び出してそれぞれの値を表示するプログラムを作成しなさい オブジェクト名  ナンバー   ガソリン残量        走行距離   排気量 kcar        552        25.1            22000      2000 bcar        441        33.5           9940        2000 //↓一応自分が書いたコードなので会ってるか分かりませんが、違ってたら教えてください Car2 { int num; double gas; int m; int h; int num1; double gas1; int m1; int h1; void show() { System.out.println("kcar"+num+ +gas+m+h); System.out.println("bcar"+num1+ +gas1+m1+h1); } } class Sample1 { public static void main(String[] args) { Car2 car1; car1 =new Car2(); car1.num=552; car1.gas=25.1; car1.m=22000; car1.h=2000; car1.num1=441; car1.gas1=33.5; car1.m1=9940; car1.h1=2000; car1.show(); } }

  • Javaの戻り値のコード

    Java初心者です。returnの例文で分からない所があります。 (1)考え方として car1.setNumGas(1234, 20.5); の時点で void setNumGas(int n, double g) はvoid setNumGas(1234, 20.5)になり 次にgetNum( ) そのものを引っ張ってきているので、 ナンバーを調べました という文字まで一緒に引っ張らないのでしょうか? なぜ 次の行のretun文だけを拾うのですか? (2)returnのイメージがまだ出来ていません。 int number = car1.getNum(); とした時点で int getNum()  にジャンプし、 その中の returnを見つけ、 そしてreturnが numを使っている所をコードを下に降りて順に探しに行く というイメージで合ってますか? -------------------------------------------------------------------- return num; →よーし探しに行こう! まずdouble getGas()の中 → うーんない 次にvoid setNumGas(int n, double g) の中 { num = n;    →   お、あった! nは今1234だな、だから表示結果は1234 --------------------------------------------------------------------------- こんな認識で合ってますでしょうか? class Car { int num; double gas; int getNum() { System.out.println("ナンバーを調べました。"); return num; } double getGas() { System.out.println("ガソリン量を調べました。"); return gas; } void setNumGas(int n, double g) { num = n; gas = g; System.out.println("車のナンバーを" + num + "にガソリン量を" + gas + "にしました。"); } void show() { System.out.println("車のナンバーは" + num + "です。"); System.out.println("ガソリン量は" + gas + "です。"); } } class Sample6 { public static void main(String[] args) { Car car1 = new Car(); car1.setNumGas(1234, 20.5); int number = car1.getNum(); double gasoline = car1.getGas(); System.out.println("サンプルから車を調べたところ"); System.out.println("ナンバーは"+ number + "ガソリン量は" + gasoline + "でした。"); } }

    • ベストアンサー
    • Java
  • 初歩的な メソッドの引数について

    参考書のサンプルなんですが、 Carクラスのメソッドの引数のところで num = n と代入しているのですが、 これを直接void setNum(int num)としたほうがらくだと思うのですがなにか意味があるのでしょうか? class Sample4{ public static void main(String args[]){ Car car1 = new Car(); car1.setNum(33); } } class Car{ int num; void setNum(int n){ num = n; System.out.println("台数" + num); } }

    • ベストアンサー
    • Java
  • プログラミングお願いします(java)

    問題 フィールドとして、「ナンバー」「ガソリン残量」「走行距離」「エンジンの排気量」の4つ、それらの値を表示するメソッド4つから構成されるCar2ラスを作成し、メインメソッドで2つのオブジェクトkcar と bcar を作成し、それぞれに、次の値を代入し、Car2ラスのメソッドを呼び出してそれぞれの値を表示するプログラムを作成しなさい オブジェクト名  ナンバー   ガソリン残量        走行距離   排気量 kcar        552        25.1            22000      2000 bcar        441        33.5           9940        2000 ↓一応自分のコードを作成しました・しかしこの問題にあってるか分かりません。違ってたら指摘してください///出来たらコード作成してくださると助かります class Car2 { int num; double gas; int m; int h; int num1; double gas1; int m1; int h1; void show() { System.out.println("kcar"+num+ +gas+m+h); System.out.println("bcar"+num1+ +gas1+m1+h1); } } class Sample1 { public static void main(String[] args) { Car2 car1; car1 =new Car2(); car1.num=552; car1.gas=25.1; car1.m=22000; car1.h=2000; car1.num1=441; car1.gas1=33.5; car1.m1=9940; car1.h1=2000; car1.show(); } }

  • コンパイルエラー (超初心者です)

    現在C言語の勉強をしているのですがテキスト通りに打ったのですが、どうしてもエラーが出てしまいます。 #include <stdio.h> struct Car{ //構造体型struct Carの宣言 int num; double gas; }; int main() { struct Car car1; //構造体型の変数(構造体)を宣言する car1.num = 1234; //メンバに値を代入する car1.gas = 25.5; printf("車のナンバーは%d :ガソリン量は%fです。\n", car1.num, car1.gas); return 0; } エラーメッセージは 15: warninng: unknown escape sequence: '\' followed by char code 0x83 といった感じです。 ちなみにコンパイラはMingw gccというのを使っています。どなたかご回答のほうをよろしくお願いします。

  • 別ファイルのclassの読み込みについて

    Javaを勉強し始めたばかりのものです。 購入した参考書を見ながら勉強していますが、表題の件の項目で参考書ではうまくいくように表記されておりますが、実際にやってみると下記エラーが表示されます。 --------------------------------------------- C:\XXXXXXXXXX>javac ../../sample/Sample1.java ..\..\sample\Sample1.java:3: シンボルを見つけられません。 シンボル: クラス Car 場所 : Sample1 の クラス Car car1 = new Car(); ^ ..\..\sample\Sample1.java:3: シンボルを見つけられません。 シンボル: クラス Car 場所 : Sample1 の クラス Car car1 = new Car(); ^ エラー 2 個 ------------------------------------------------------ ちなみに下記はソースとなります。 -------------------------------------------- 【Car.java】 //Carクラス class Car { private int num; private double gas; public Car(){ num = 0; gas = 0.0; System.out.println("車を作成しました。"); } public void setCar(int n, double g){ num = n; gas = g; System.out.println("ナンバーを" + num + "ガソリン量を" + gas + "にしました。"); } public void show(){ System.out.println("車のナンバーは" + num + "です。"); System.out.println("ガソリン量は" + gas + "です。"); } } 【Sample1.java】 class Sample1 { public static void main (String args[]){ Car car1 = new Car(); car1.show(); } } --------------------------------------------------- なんとなくエラーが出るだろうとはわかりますが、上記の記載方法だとやはりうまくいかないのでしょうか? お忙しいところ申し訳ありませんが、どなたかご教示の程お願いいたします。

    • ベストアンサー
    • Java
  • 「インターフェイス」って何の為に必要なんですか?

    “値を変更できるフィールドがもてない”・“抽象クラスしかもてない”のに何の為に記述するんだろう?と思って、インターフェイスを入力せずに実行してみたのですが、入力してもしなくても同じ結果が出ました。 同じ結果が出るならなぜ必要なんですか? ************* コード **************************************** //のりものインターフェイス interface iVehicle{ void vShow(); } //材料インターフェイス interface iMaterial{ void mShow(); } //車クラス class Car implements iVehicle,iMaterial{ private int num; private double gas; public Car(int n, double g){ num = n; gas = g; System.out.println("ナンバー"+ num + "ガソリン量" +gas + "の車を作成しました。"); } public void vShow(){ System.out.println("車のナンバーは" + num +"です。"); System.out.println("ガソリン量は" + gas + "です。"); } public void mShow(){ System.out.println("車の材質は鉄です。"); } } class Sample1{ public static void main(String[] args){ Car car1 = new Car(1234, 20.5); car1.vShow(); car1.mShow(); } } ************************************************************** <実行結果> 「ナンバー1234ガソリン量20.5の車を作成しました。  車のナンバーは1234です。  ガソリン量は20.5です。  車の材質は鉄です。              」 インターフェイスを記述してもしなくても、同じく上記の結果が 出ました。 ※ちなみに抽象クラスもいったい何なのかよく分りません。

    • ベストアンサー
    • Java
  • 引数の概念について質問

    引数とは、以下のURLに次のように定義されていました。 「メソッドを呼び出す際に渡された値を受け取る変数。」 http://www.kab-studio.biz/Programing/JavaA2Z/Word/00000160.html 質問:引数とは、「あるメソッドに入力する(渡す)値」ですよね?それなのに、「メソッドを呼び出す際に渡された値を受け取る変数。」とかいてありますが、これはどういうことですか? java初心者の私でもわかりやすいように解説してくだされば幸いです。 質問2:上記URLに以下のようなことも書かれていました。 「呼び出す際に「メソッド名( 引数に渡す値 );」という書式で「引数の変数」に「引数に渡す値」をコピーすることができる。 このコピーは、変数の代入と全く同じである。」 これもよく意味がわかりません。 とくに、「引数の変数」という記述がよくわかりません。また、なぜ変数の代入と同じなのですか? うーん、、よくわからない。

    • ベストアンサー
    • Java
  • "add"とは?f

    class Car { int num; double gas; void setNum(int n) { num = n; System.out.println("ナンバーを" + num + "にしました。"); } void setGas(double g) { gas = g; System.out.println("ガソリン量を" + gas + "にしました。"); System.out.println("この車は満タンで40リットル入ります。"); } void show() { System.out.println("車のナンバーは"+num+"です。"); System.out.println("ガソリン量は"+gas+"です。"); } } class Prog11_1 { public static void main(String args[]) { Car car1 = new Car(); Car car2 = new Car(); car1.setNum(1234); car1.setGas(20.5); car2.setNum(5678); car2.setGas(30.8); car1.addGas(10.0); car2.addGas(10.0); car1.show(); car2.show(); } } 上記のプログラムの足りないところを補い、完成させるというものなんですが、"add"というのは一体どのような役割を持っているものなんでしょうか? 分かる方いらっしゃいましたら、よろしくお願いします。

    • ベストアンサー
    • Java
  • 初心者なので教えてほしいです。

    下記のコードなんですが、どこか間違っていますか? テキスト通りに入力したはずなんですが、 『メソッド本体がないか、abstractとして宣言されています』 というエラーが出てしまいます。 どういう意味なのか分らなくて・・・ **************************************************** //車クラス class Car{ int num; double gas; } //車クラスのオブジェクトを作成する class Sample1{ public static void main(String[] args); { Car car1; car1 = new Car(); car1.num = 1234; car1.gas =20.5; System.out.println("車のナンバーは" +car1.num+ "です。"); System.out.println("ガソリンの量は" +car1.gas+ "です。"); } } *************************************************************

    • ベストアンサー
    • Java

専門家に質問してみよう