みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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システム開発」についての質問です。

投稿日時 - 2019-07-18 06:14:13

QNo.9636532

困ってます

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

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

投稿日時 - 2019-07-23 11:21:51

お礼

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

投稿日時 - 2019-07-26 08:56:19

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.5

System.out.println("車を作成しました。");
System.out.println("この車のナンバーは" + num + "です。");
System.out.println("この車のガソリンが入る最大量は " + gas + "です。");

これをprintメソッドにいれてください

投稿日時 - 2019-07-23 00:45:49

お礼

ありがとうございます、うまくいきました!

<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さんの見解をお聞かせいただければと…(^^;

投稿日時 - 2019-07-23 05:52:55

ANo.4

こんな感じですね

public Car() {}
public void print() {
システムプリント
}


メインで
Car car = new Car()
car.setNum(1)
car.setGas(1.8)
car.print()

投稿日時 - 2019-07-19 22:26:08

お礼

ありがとうございます、書き換えてみました。

<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が消えておりますが、ゲッターは不要ということでしょうか?
セッター、ゲッターメソッドを使って、

――――――――――――――――――――――
この車のナンバーは××××です
この車のガソリンが入る最大量は〇〇〇〇です。
――――――――――――――――――――――

と、値をセットして、ゲットして、出力する、ということをやってみたいです。
度々すみまませんが、お手隙の時にまたご回答いただけますと幸いです。
よろしくお願い致します。

投稿日時 - 2019-07-22 21:50:17

ANo.3

>coronoeさんありがとうございます、インスタンス変数、クラス変数について、理解できました。

#1のお礼を読む限り、全く理解できていませんよ。

投稿日時 - 2019-07-19 01:50:26

お礼

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

投稿日時 - 2019-07-19 20:16:23

ANo.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が取得できる
}
}

投稿日時 - 2019-07-19 01:26:11

お礼

ありがとうございます、はい、セッターで値を設定して、ゲッターで値を取得して標準出力する、というのを実践したいと考えています。
手元の参考書がセッターやゲッターに触れておらず、ググってもこれぞという情報を見つけられない状態でして…お手隙の時にご対応いただけますと幸いです。

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は出力されません。
コンパイルエラーはないので、うまくいくと思ったのですが…。
どうすればセッター、ゲッターをうまく活用でき、値を出力できますでしょうか。
度々すみません。

投稿日時 - 2019-07-19 20:12:10

ANo.1

わかる範囲で回答します。
ソースコードを見て感じることとしてはインスタンス変数とクラス変数の違いについてをしっかり理解された方が良いと思います。

簡単に言うと、インスタンス変数はnewをすることで使える(オブジェクトと紐づいている)ようになる変数で、クラス変数はnewをしなくても使える(クラスと紐づいている)変数です。

今回、mainメソッドの中で、numとgasを使おうとしていますが、これらの変数はstaticがついていないため、インスタンス変数となります。
そうなるとインスタンス変数は上記で述べたとおりnewをしなくては使えない変数をnewをしないで使っているため、エラーが出ることになります。

ただ動かすだけであれば、staticを変数宣言につけることでエラーは解決できます。
しかしながら、オブジェクト(newをしたもの)ごとにガソリンとナンバーをデータとして持ちたい場合はstaticをつけてしまうとクラス全体で共有する値となってしまうため、staticをつけることは間違いとなります。

以上です。
何れにしても、クラス変数とインスタンス変数の違いを再度見直してみることをお勧めします。

投稿日時 - 2019-07-18 14:58:08

お礼

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;」等に戻しているのでしょうか…。

投稿日時 - 2019-07-18 21:08:22