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

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

getter、setterメソッドを活用したいです

Javaのgetter、setterメソッドをうまく使って、下記のコードを実行しようとしたのですが。 ---------------- package javatest; public class Jidosha { private int num; private double gas; public void setNum(int num) { this.num = num; } public void setGas(double gas) { this.gas = gas; } public int getNum() { return num; } public double getGas() { return gas; } public static void main(String args[]) { System.out.println("この車のナンバーは" + num + "です。"); System.out.println("この車のガソリンが入る最大量は " + gas + "です。"); } } ---------------- Eclipse上では「System.out.println・・・」のところで「非 static フィールド gas を static 参照できません」といったエラーが出てきまして。 getter、setterメソッドをうまく活用して「この車のナンバーは××××です」「この車のガソリンが入る最大量は〇〇〇〇です。」という文を出力するには、どう書けばよいでしょうか。 よろしくお願い致します。 ※OKWAVEより補足:「Webシステム開発」についての質問です。

  • Java
  • 回答数6
  • ありがとう数6

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

  • ベストアンサー
  • 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% (1622/5658)
回答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

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

    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
  • 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
  • プログラムの合体。

    jump7799_4836さん 2018/7/2103:34:44 public class Test2 { public static int メソッド () { System.out.println("メソッド()が呼ばれました"); return 0; } public static int メソッド (int i) { System.out.println("メソッド(int i)が呼ばれました"); return i; } public static int メソッド (int i, int j) { System.out.println("メソッド(int i, int j)が呼ばれました"); return i; } public static int メソッド (short s) { System.out.println("メソッド(short s)が呼ばれました"); return s; } public static int メソッド (double d) { System.out.println("メソッド(double d)が呼ばれました"); return (int) d; } } public メソッド class Test2 { public メソッド static void main(String[] args) { Test2.メソッド (); Test2.メソッド (1); Test2.メソッド (1,2); Test2.メソッド (1.1); Test2.メソッド ((short) 1); Test2.メソッド ((double)1); } } kouzou@GD348ZZD9:/WORK$ javac Test2.java Test2.java:29: エラー: class、interfaceまたはenumがありません public メソッド class Test2 { ^ Test2.java:30: エラー: <identifier>がありません public メソッド static void main(String[] args) { ^ エラー2個 2つのプログラムが合体することってあるのですか? いつもすみません。 解説のほど、宜しくお願い申し上げます。

    • ベストアンサー
    • Java
  • 再帰メソッドについて

    いつもお世話になっております。 再帰メソッドについて質問があります。 後述のプログラム実行後、以下の結果が 得られました。 ********** depth = [0] , value = [0] ********** depth = [1] , value = [1] ********** depth = [2] , value = [2] ########## depth = [2] , value = [3] …★ ########## depth = [1] , value = [3] recursionMethod() は3回呼ばれました。 (以下、ソース) public class RecursionTest { private static final int MAX_DEPTH = 2; private static int cnt = 0; private int val =0; public static void main(String[] args) { // 再帰メソッドの呼び出し RecursionTest own = new RecursionTest(); own.recursionMethod(0); System.out.println("\n recursionMethod() は" + cnt + "回呼ばれました。"); } private void recursionMethod(int depth) { // 再帰メソッドが呼ばれた回数をカウントする cnt++; System.out.println("********** depth = [" + depth + "] , value = [" + val + "]"); val++; // パラメータ depth が MAX値に到達したら、return する if (depth++ >= MAX_DEPTH) { return; } // 自分自身の呼び出し recursionMethod(depth); System.out.println("########## depth = [" + depth + "] , value = [" + val + "]"); } } 実行結果の★以降が得られる理由が全く分かりません。 ・return で main() に戻るはずなのになぜ「###~」のログが出力されるのか ・depth の値がなぜデクリメントされるのか (誰がデクリメントの処理をしているのか) そもそも上記の結果を返すことが「メソッドの再帰的呼び出し」ということなのでしょうか? ご教授頂ける方がいらっしゃいましたら、宜しくお願い致します。

    • ベストアンサー
    • Java
  • 抽象クラス、インターフェイスについて

    少し長いですが、以下にコードを書きました。これでコンパイルすると、13個ほどエラーが出て、何がなんだかわかりません。何が間違っているのでしょうか?よろしくお願いします。ちなみに本を見ながらの独学です。 //のりものインターフェイス interface iVehicle { abstract void show(); } //車くらす class Car implements iVehicle { private int num; private double gas; public Car(int n, double g)) { num = n; gas = g; System.out.println("ナンバー" + num +"ガソリン量" + gas +"の車を作成しました"); } public void show() { System.out.println("車のナンバーは" + num +"です"); System.out.println("ガソリン量は" + gas +"です"); } } //飛行機クラス class Plane extends Vehicle { private int flight; public Plane(int f) { flight = f; System.out.println("便" + flight +"の飛行機を作成しました"); } public void show() { System.out.println("飛行機の便は" + flight +"です"); } } class sample8 { public static void main(String args[]) { iVehicle ivc[]; ivc = new iVehicle[2]; ivc[0] = new Car(1234, 20.5); ivc[1] = new Plane(232); for(int i=0; i<ivc.length; i++){ if(vc[i] instanceof Car) ivc[i].show(); } } }

    • ベストアンサー
    • Java
  • equals()メソッドの継承について

    ある本に ーーーーーーーーーーーーーーーーーーーーー class Car { protected int num; protected double gas; public Car() { num = 0; gas = 0.0; System.out.println("車を作成しました。"); } } class Sample8 { public static void main(String[] args) { Car car1 = new Car(); Car car2 = new Car(); Car car3; car3 = car1; boolean bl1 = car1.equals(car2); boolean bl2 = car1.equals(car3); System.out.println("car1とcar2が同じか調べたところ" + bl1 + "でした。"); System.out.println("car1とcar3が同じか調べたところ" + bl2 + "でした。"); } } JavaのクラスはすべてObjectクラスのメンバを継承していますので、equals()メソッドを記述しなくても、このメソッドを呼び出すことが出来るわけです。 ----------------------------------------- JavaのクラスはすべてObjectクラスのメンバを継承していますので、equals()メソッドを記述しなくても、このメソッドを呼び出すことが出来る    についてですが、 逆から言えば他の言語の場合は本来クラスの宣言の辺りにでもequals()メソッドを記述する必要があるという意味なんでしょうか?

    • ベストアンサー
    • 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
  • 初歩的な メソッドの引数について

    参考書のサンプルなんですが、 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
  • 「インターフェイス」って何の為に必要なんですか?

    “値を変更できるフィールドがもてない”・“抽象クラスしかもてない”のに何の為に記述するんだろう?と思って、インターフェイスを入力せずに実行してみたのですが、入力してもしなくても同じ結果が出ました。 同じ結果が出るならなぜ必要なんですか? ************* コード **************************************** //のりものインターフェイス 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
  • 初心者なので教えてほしいです。

    下記のコードなんですが、どこか間違っていますか? テキスト通りに入力したはずなんですが、 『メソッド本体がないか、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