• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:getter、setterメソッドを活用したいです)

Javaのgetter、setterメソッドを使って車の情報を出力する方法

このQ&Aのポイント
  • Javaのクラスでgetter、setterメソッドを活用して車の情報を出力する方法について説明します。
  • 上記のコードでは、非 static フィールド gas を static 参照できずエラーが発生しています。
  • このエラーを回避するためには、mainメソッド内でインスタンスを作成し、そのインスタンスに対してgetterメソッドを使用する必要があります。

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

  • ベストアンサー
  • mgjgxgww
  • ベストアンサー率25% (5/20)
回答No.6

プリントメソッドをモデルにいれている分にはゲッターはなくともよいですが、本来的にはモデルクラスはデータの保持のみのクラスです 他のクラス、今回だとメインクラスにプリントメソッドを実装するとなると車モデルから変数値を取得するにはゲッターがないといけません。

nihonbashiboy
質問者

お礼

今回はJidoshaというモデルクラスにプリントメソッドがあったので、ゲッターが不要でも結果が出たのですね。 ありがとうございました。

その他の回答 (5)

  • mgjgxgww
  • ベストアンサー率25% (5/20)
回答No.5

System.out.println("車を作成しました。"); System.out.println("この車のナンバーは" + num + "です。"); System.out.println("この車のガソリンが入る最大量は " + gas + "です。"); これをprintメソッドにいれてください

nihonbashiboy
質問者

お礼

ありがとうございます、うまくいきました! <Main.java> package javatest; public class Main { public static void main(String args[]){ Car car = new Car(); car.setNum(1); car.setGas(1.8); car.print(); } } -------------------------- <Car.java> package javatest; public class Car { private int num; private double gas; public Car() { System.out.println("車を作成しました。"); System.out.println("この車のナンバーは" + num + "です。"); System.out.println("この車のガソリンが入る最大量は " + gas + "です。"); } public void setNum(int num) { this.num = num; } public void setGas(double gas) { this.gas = gas; } public void print() { System.out.println("車を作成しました。"); System.out.println("この車のナンバーは" + num + "です。"); System.out.println("この車のガソリンが入る最大量は " + gas + "です。"); } } -------------------------- ただ気になりましたのは、上記にありますように、 public int getNum() { return num; } public double getGas() { return gas; } が無くても機能し、 -------------------------- 車を作成しました。 この車のナンバーは0です。 この車のガソリンが入る最大量は 0.0です。 車を作成しました。 この車のナンバーは1です。 この車のガソリンが入る最大量は 1.8です。 -------------------------- という結果が出てくるということです。 ゲッターメソッドが不要なのはなぜでしょうか? 第十三回-02 何故クラスを使うのか? https://brain.cc.kogakuin.ac.jp/~kanamaru/lecture/prog1/13-02.html を読むと、カプセル化(データ隠蔽)のためにsetterやgetterを使うという話があり、 mainクラスにnumやgasが直接記載されていないのもカプセル化を実現するため、と理解したのですが。 setterだけあればカプセル化の実現ができるのでしたら、なぜgetterがいるのでしょうか。 よかったらmgjgxgwwさんの見解をお聞かせいただければと…(^^;

  • mgjgxgww
  • ベストアンサー率25% (5/20)
回答No.4

こんな感じですね public Car() {} public void print() { システムプリント } メインで Car car = new Car() car.setNum(1) car.setGas(1.8) car.print()

nihonbashiboy
質問者

お礼

ありがとうございます、書き換えてみました。 <Main.java> package javatest; public class Main { public static void main(String args[]){ Car car = new Car(); car.setNum(1); car.setGas(1.8); car.print(); } } ------------------------- <Car,java> package javatest; public class Car { private int num; private double gas; public Car() { System.out.println("車を作成しました。"); System.out.println("この車のナンバーは" + num + "です。"); System.out.println("この車のガソリンが入る最大量は " + gas + "です。"); } public double getGas() { return gas; } public void setGas(double gas) { this.gas = gas; } public int getNum() { return num; } public void setNum(int num) { this.num = num; } public void print() { // TODO 自動生成されたメソッド・スタブ } } ------------------------- ただ、実行してみますとやはり結果は、 ------------------------- 車を作成しました。 この車のナンバーは0です。 この車のガソリンが入る最大量は 0.0です。 ------------------------- と、出力されます。 Mainクラスの方でgetNumやgetGasが消えておりますが、ゲッターは不要ということでしょうか? セッター、ゲッターメソッドを使って、 ―――――――――――――――――――――― この車のナンバーは××××です この車のガソリンが入る最大量は〇〇〇〇です。 ―――――――――――――――――――――― と、値をセットして、ゲットして、出力する、ということをやってみたいです。 度々すみまませんが、お手隙の時にまたご回答いただけますと幸いです。 よろしくお願い致します。

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.3

>coronoeさんありがとうございます、インスタンス変数、クラス変数について、理解できました。 #1のお礼を読む限り、全く理解できていませんよ。

nihonbashiboy
質問者

お礼

そうかもしれません…。 クラス変数とクラスメソッドの組み合わせなら、オブジェクトを生成しなくてもいいのかもしれませんが。 オブジェクトの作成に慣れたいので、インスタンス変数とインスタンスメソッドで記述してみたいような気もします。

  • mgjgxgww
  • ベストアンサー率25% (5/20)
回答No.2

自動車モデルとメインクラスに分けたほうがいいです 自動車モデル num gas メインのメインメソッドで自動車モデルをnew(インスタンス化)して、その際にでもコンストラクタなりセッターでnumとgasをセット、インスタンス化した自動車からゲッターで取得するのがきっと、あなたのしたいこと こんな感じ? public class Car { private int num private double gas コンストラクタ セッター、ゲッター } public class Main{ public static void main(args[]){ Car car = new Car() car. setNum(1) car. getNum()// 1が取得できる } }

nihonbashiboy
質問者

お礼

ありがとうございます、はい、セッターで値を設定して、ゲッターで値を取得して標準出力する、というのを実践したいと考えています。 手元の参考書がセッターやゲッターに触れておらず、ググってもこれぞという情報を見つけられない状態でして…お手隙の時にご対応いただけますと幸いです。 mgjgxgwwさんの仰るように、クラスを分けてみました。 <Car.java> package javatest; public class Car { private int num; private double gas; public Car() { System.out.println("車を作成しました。"); System.out.println("この車のナンバーは" + num + "です。"); System.out.println("この車のガソリンが入る最大量は " + gas + "です。"); } public double getGas() { return gas; } public void setGas(double gas) { this.gas = gas; } public int getNum() { return num; } public void setNum(int num) { this.num = num; } } <Main.java> package javatest; public class Main { public static void main(String args[]){ Car car = new Car(); car.setNum(6); car.setGas(7.0); car.getNum(); car.getGas(); } } Mainクラスを実行してみますと、コンパイルエラーはないのですが、結果は ----------------------- 車を作成しました。 この車のナンバーは0です。 この車のガソリンが入る最大量は 0.0です。 ----------------------- となりました。numにしセットした値6、gasにセットした値7.0は出力されません。 コンパイルエラーはないので、うまくいくと思ったのですが…。 どうすればセッター、ゲッターをうまく活用でき、値を出力できますでしょうか。 度々すみません。

  • coronoe
  • ベストアンサー率50% (1/2)
回答No.1

わかる範囲で回答します。 ソースコードを見て感じることとしてはインスタンス変数とクラス変数の違いについてをしっかり理解された方が良いと思います。 簡単に言うと、インスタンス変数はnewをすることで使える(オブジェクトと紐づいている)ようになる変数で、クラス変数はnewをしなくても使える(クラスと紐づいている)変数です。 今回、mainメソッドの中で、numとgasを使おうとしていますが、これらの変数はstaticがついていないため、インスタンス変数となります。 そうなるとインスタンス変数は上記で述べたとおりnewをしなくては使えない変数をnewをしないで使っているため、エラーが出ることになります。 ただ動かすだけであれば、staticを変数宣言につけることでエラーは解決できます。 しかしながら、オブジェクト(newをしたもの)ごとにガソリンとナンバーをデータとして持ちたい場合はstaticをつけてしまうとクラス全体で共有する値となってしまうため、staticをつけることは間違いとなります。 以上です。 何れにしても、クラス変数とインスタンス変数の違いを再度見直してみることをお勧めします。

nihonbashiboy
質問者

お礼

coronoeさんありがとうございます、インスタンス変数、クラス変数について、理解できました。 mainメソッドは、 ------- public static void main(String args[]) { Jidosha jidosha1 = new Jidosha(); jidosha1.num = 12; jidosha1.gas = 0.5; System.out.println("この車のナンバーは" + num + "です。"); System.out.println("この車のガソリンが入る最大量は " + gas + "です。"); } ------- に書き換えてみました。 ただ、「System.out.println~」のところでまだエラーが残り。 setNum(int num) { this.num = num; public int getNum() { return num; } の辺りも、まだどのような動きをしているのか曖昧でして。 setで値を設定して、getで値を戻しているんでしょうか。 でもreturnで戻すといっても、Jidoshaクラス1つしかないコードで値を戻すとなると、最初の「private int num;」等に戻しているのでしょうか…。

関連するQ&A

専門家に質問してみよう