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

解決済みの質問

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 + "でした。");
}
}

投稿日時 - 2014-02-03 00:46:48

QNo.8458946

困ってます

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

>コマンドプロンプトでコンパイルし直してみると
>ナンバーは-567ガソリン量は20.5でした。
>と出ました。

その前に出たはずの「ナンバーを調べました:1234」の部分に注目してもらいたかったのですがね。それを疑問に思わないのであれば"return num;"でnumの値を参照するところも問題ないはずです。

>普通のメソッドだけならは

Javaのメソッドには値を返すものと返さないもの(返り値型がvoid)がありますが、どちらが「普通」ということはありません。
メソッドが返した値を変数に代入するコードだって、質問者さんはこれまでに何度も見ているはずです。ANo.2の補足にあった"String str = br.readLine();"とか。

>こんな使い方も出来るんですね。今度から使ってみます。

お勧めはしません。適宜分けて書いたほうが読みやすいことが多いですし、例にあったBufferedReaderは繰り返して読み込みすることが多いので変数に入れたほうが便利です。

投稿日時 - 2014-02-12 23:14:30

補足

何度もすいません。

>その前に出たはずの「ナンバーを調べました:1234」の部分に注目してもらいたかったのですがね。

すいません、大変申し訳ないです。ちゃんと見ていなかったです。散漫でした。 提示して頂いたのはいわゆる
 setNumGas(1234~  で引数を呼び出し元に渡すパターンですね。

それと普通というのは int number = のように代入をしていないという意味でした。

>お勧めはしません。適宜分けて書いたほうが ~

参考程度に記憶にとどめておきます。

投稿日時 - 2014-02-13 21:48:00

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

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

回答(7)

ANo.6

getNum()をこう書き換えたら何がどうなるか理解できますか? main()の中でcar1.setNumGas(1234, 20.5);を呼んでいる前提で。
int getNum()
{
System.out.println("ナンバーを調べました:"+num);
return -567;
}

> ただのbr も
>         ↓
> 最終的にはprintlnと連携することで画面表示まで出来るようになる
>
> という感じで、最初の状態に比べて複雑化していっていると言えませんか?

ANo.1の補足にあったのは「変数というのは・・・どんどん複雑化するものではないのでしょうか?」という質問でした。
brという変数はオブジェクトの代入によって初期化された後、何も変化していません。つまり、複雑になっていないということです。
println()で出力ができるのは、「変数の状態がどんどん複雑化するから」ではありません。

ちなみに、よけいに混乱させてしまうかもしれませんが、ANo.2の補足にあったコードはbrやstrみたいな変数を使わずに書くこともできるんです。
System.out.println("英字を入力してください。");
System.out.println("あなたが入力したのは"+ new BufferedReader(new InputStreamReader(System.in)).readLine() +"です。");

投稿日時 - 2014-02-11 01:06:56

補足

>return -567;

コマンドプロンプトでコンパイルし直してみると

ナンバーは-567ガソリン量は20.5でした。

と出ました。
ただ、大変申し訳ないのはただ単にint number = を変に思っていただけかもしれません。
テキストをちゃんと読んでみると、
普通のメソッドだけならはその前の行にもあるように
car1.setNumGas(1234, 20.5)ですが、
僕が疑問に思っていた箇所は
car1.getNum( ) とし、getNum ( )を呼び出し、

System.outを処理、

その次にreturnがある。式はnum(現在の数値は1234これを呼び出し元に返す) 

それを単にnumberに代入

println で number→1234 などを表示

これでやっと合ってますか。

> ANo.2の補足にあったコードはbrやstrみたいな変数を使わずに書く~

混乱はしてないです。こんな使い方も出来るんですね。今度から使ってみます。

投稿日時 - 2014-02-11 23:11:43

お礼

たびたび回答すいません。

投稿日時 - 2014-02-11 23:12:31

ANo.5

ANo.4の最後の部分の訂正です。

× 変数の値を参照するのはreturn文でも他の式の中でもありません。
○ 変数の値を参照するのはreturn文でも他の式の中でも違いはありません。

投稿日時 - 2014-02-09 19:18:51

お礼

訂正有難うございます。

投稿日時 - 2014-02-09 21:03:16

ANo.4

>BufferedReaderはクラスライブラリのひとつで、オブジェクトの作成というやつです

オブジェクトの作成をするにはnewが必要で、ANo.2の補足にある例はいきなりそこから間違っているわけですが、それはおいておきましょう。

>(1)brにBufferedReaderのメソッドが入る。(間違い)
→ BufferedReaderクラスのオブジェクトを新しく生成して、変数brに入れる。

>(2)変数brをreadLineメソッドとセットで用い、それをstrという新たな箱に入れる。(間違いとは言い切れないが、正しいイメージを持っているかどうかが怪しい)
→ 変数brに入っているオブジェクトに対して、readLine()メソッドを呼ぶ。その結果はString型のオブジェクトであり、それを変数strに入れる。

>(3)最後にstrの箱の中身をprintlnで表示させる。
これはその通り。

>次から次へ変数に色んなものを入れて、どんどん複雑化していってると言えませんか?

言えません。値を入れられているのはbrもstrもそれぞれ1回だけですし、「色んなもの」は入っていません。指定した型の何らかの値が入っているだけです。
何と比べて何が複雑になっていると思うのでしょう?

元の"numの値の参照"については、ローカル変数・インスタンス変数・クラス変数の区別と、変数のスコープ、変数の生存期間について勉強し直してください。
ふと思ったのですが、もしかして質問者さんは"return文だから"何か特別なことがあると思っていますか? 変数の値を参照するのはreturn文でも他の式の中でもありません。

投稿日時 - 2014-02-08 10:30:59

補足

>>(2)変数brをreadLineメソッドとセットで用い、それをstrという新たな箱に入れる。(間>違いとは言い切れないが、正しいイメージを持っているかどうかが怪しい)

結構駆け足で、やさしいJava の2冊を勉強したので、
復習が十分でない状態なので、1つ1つの項目がかなり怪しいかもしれません。
(特にclass の章以降の説明がイマイチピンと来ていません)


>何と比べて何が複雑になっていると思うのでしょう?

最初の状態と比べて複雑化していると思っています。
        ただのbr も
        ↓
最終的にはprintlnと連携することで画面表示まで出来るようになる

という感じで、最初の状態に比べて複雑化していっていると言えませんか?

>return文だから"何か特別なことがあると思っていますか?

特別ってほどのイメージは持ってないですが、この例文のせいか
イマイチピンと来ていません。
僕なりに例文を書き換えてみました
――――――――――――――
省略

int getNum()
{
System. out . print ln (“ナンバーを調べました。”)
return 1;
}

省略

System . out . print ln (“ナンバーは” + number + “でした。”);


Car car 1 = new Car();
int number = car1.getNum();

-------------------------------------------------表示結果
ナンバーを調べました。
サンプルから車を調べたところ
ナンバーは1でした。

これならわかるので、ちょっと number num とか変数がいくつか並ぶことに慣れていないだけかもしれません。

投稿日時 - 2014-02-09 22:21:29

ANo.3

> (1)brにBufferedReaderのメソッドが入る。

間違い。変数brにメソッドは入らないし、BufferedReaderはメソッドじゃない。
以下論外。

投稿日時 - 2014-02-04 23:48:57

補足

大変失礼いたしました。
BufferedReaderはクラスライブラリのひとつで、オブジェクトの作成というやつですね。

投稿日時 - 2014-02-05 23:54:56

ANo.2

Java初心者とおっしゃいますが、質問履歴を拝見する限り半年かそれ以上はJavaの勉強をしていて、Java以外の言語もお使いのようです。それで質問文にあるような認識なのだとすると、矯正が大変そうです。

> なぜ上に行くのですか? 処理って下(setNumGas)に行かないのですか?

確かに、メソッドの中の処理は基本的に上から下へ進みます(ループ構造によって下から上へ戻る場合もある)。
しかし、それはあくまでもメソッドの中での話で、メソッドの終わりまで行ったらそのメソッドの処理はそこで終わり。下のメソッド(この場合setNumGas())に行くことはありません。

そして、変数numの値の参照は、上から下へ進む「処理」ではないんです。メソッドの中で変数を参照する場合、
・そのメソッドの中でその名前の変数が宣言されていればそれを使う
・そのメソッドの中になければ、そのメソッドを定義しているクラスの中から探す
という順番になります。
getNum()メソッドの中の "return num;" で変数numの値を参照しようとすると、
・getNum()の中ではnumという変数は宣言されていない
・getNum()を定義しているクラスCarには "int num;" で宣言されているインスタンス変数がある
→ インスタンス変数のnumの値を使う
となって、getNum()以外のメソッドのことは気にしません。

> 変数というのは一時的な箱で値とかメソッドそのものを入れてどんどん複雑化するものではないのでしょうか?

どういう意味で言っているのか分かりませんが、「どんどん複雑化」することはありませんし、Java言語では変数にメソッドを入れることもできません。

投稿日時 - 2014-02-04 22:15:23

補足

>矯正が大変そうです。

変な勉強の仕方・教えれ方をしたかもしれませんが、地道に理解を変えていくしかないです。
変数numの値の参照の考え方はまだ慣れてないせいか、すんなり理解できてませんが、頭にたたき込んでおきます。

>、「どんどん複雑化」することはありませんし、Java言語では>変数にメソッドを入れることもできません。

例えば、
-------------------------------------------------
System.out.println("英字を入力してください。");

BufferedReader br =
BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
System.out.println("あなたが入力したのは"+str+"です。");
--------------------------------------------
この例で言うと、
(1)brにBufferedReaderのメソッドが入る。
(2)変数brをreadLineメソッドとセットで用い、それをstrという新たな箱に入れる。
(3)最後にstrの箱の中身をprintlnで表示させる。
次から次へ変数に色んなものを入れて、どんどん複雑化していってると言えませんか?

投稿日時 - 2014-02-04 23:38:03

ANo.1

……あー、なんというか、すごい発想ですね。

まず(1)から。
> car1.setNumGas(1234, 20.5); の時点で
> void setNumGas(int n, double g) はvoid setNumGas(1234, 20.5)に
なりません。
void setNumGas(int n, double g) はあくまで void setNumGas(int n, double g) のままです。
変化するのは n と g の「中身」です。
また、setNumGas(int n, double g) で行う処理は
> num = n;
> gas = g;
> System.out.println("車のナンバーを" + num + "にガソリン量を" + gas + "にしました。");
の 3 つだけです。たしかに num は getNum() で使われてはいますが、setNumGas(int n, double g) ではそんなことは知りませんし関係ありません。

次に(2)。
コンピュータはあなたが考えているようなややこしいことなんてしていません。

まず
> int number = car1.getNum(); とした時点で
> int getNum()  にジャンプし、
は(細かいことは置いといて)あっています。次にそのジャンプした先での処理を順に行います。
この場合の処理の内容は
> System.out.println("ナンバーを調べました。");
> return num;
です。したがって
--------------------------------------------------------------------
 System.out.println("ナンバーを調べました。"); → じゃあ標準出力に "ナンバーを調べました。" するね
 return num; → えーっと、return になったからここで関数終了か。っと、なになに、num の値を関数の戻り値にしろってか。
--------------------------------------------------------------------
という処理を行います。

上記に続けてその num の値を持ってくる必要があるのですが、
> --------------------------------------------------------------------
> return num; →よーし探しに行こう!
の部分は正しいです。また、numと言う変数が出てきたらそれがどこにあるかをさがすので、
> まずdouble getGas()の中 → うーんない
も正しいです。
(正確には、「まず return 文がある位置で有効なローカル変数の中 → うーんない」なのですが)

しかし、そのあとの
> 次にvoid setNumGas(int n, double g) の中
> {
> num = n;    →   お、あった!
> nは今1234だな、だから表示結果は1234
> ---------------------------------------------------------------------------
が間違いです。次には num をそのクラスのインスタンスの中から探します。この場合は
> class Car
> {
> int num;
で num が int 型の変数として定義されているのでその値を使用します。

次にその変数に格納されている値を利用することになりますが、コンピュータは値を引き出す変数に前に何があったかを覚えてなんかいません。
この場合、以前に num に 1234 が代入されたから 1234 を返しているのではなく、
return の処理を行っている時点での num の値が 1234 だから 1234 を返しています。

投稿日時 - 2014-02-03 03:12:50

補足

>次には num をそのクラスのインスタンスの中から探します。

ちょっとわからないです。なぜ上に行くのですか? 処理って下(setNumGas)に行かないのですか?

>コンピュータは値を引き出す変数に前に何があったかを覚えてなんかいません。

についてですが、変数というのは一時的な箱で値とかメソッドそのものを入れてどんどん複雑化するものではないのでしょうか?
例えば
int age = 35;
System.out.print("age:");
System.out.print(age);

35
というものだってコンピュータがage = 35というものをずっと覚えているから表示できるのではないですか?

>return の処理を行っている時点での num の値が 1234 だから

これもわからないです。色々すいません。

投稿日時 - 2014-02-04 00:17:55

お礼

長い文章を打ち込んでもらっての解説有難うございます!

投稿日時 - 2014-02-03 23:31:52