質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

4回答

1566閲覧

java 戻り値について

kimura

総合スコア59

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2015/09/08 01:56

public class test {
public static void main(String[] args){
int [] n = {1, 2, 3};
clear(n);
System.out.print(n[0] + "," + n[1] + "," + n[2]);
}

public static void clear(int [] a){ a[0] = 0; a[1] = 0; a[2] = 0; return; }

}

初心者ですのでわかりにくいと思いますが宜しくお願いします。

上記は参考書の例題です。

今まで上記のclearメソッドの場合は、a[0]~a[2]が整数で返すので戻り値がintになると思ってました。

voidで書いてあるのはmeinメソッドがintだからですか?

戻り値について参考書に書いてある部分を読み直したのですがイマイチ分からなく質問させていただきました。

申し訳ありませんがご教授お願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

関数のイメージってこんな感じですが…

Java

1関数名() 2{ 3 処理したい作業; 4 : 5 return 作業結果; 6}

「関数名=作業名」です。

作業の結果を知りたい場合に、戻り値を貰います。
質問の場合、作業が「すべて0で初期化する」だけと決まっているので、結果は見るまでもありません。
ですので、return文を使っていません。


こういう場合ではなくて、例えば「a+b をして欲しい」という場合があるとします。
(これは別に関数化する必要はないのですが、ちょっと関数にすることを考えてみます。)

やりたいのは「a+b」です。

…ということは、実際には「? = a+b」という形で答えを受け取る必要もあります。
関数のイメージとしては、以下のような感じです。

Java

1?の型 加算処理( a, b ) 2{ 3 return a+b; 4}

実際には引数にも型があるので、整数の足し算で考えると以下のようになります。

Java

1public static int calcAdd( int a, int b ) 2{ 3 return a+b; 4}

こんな感じで結果が必要な場合に、returnを使います。

投稿2015/09/08 04:17

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kimura

2015/09/08 09:52

ご回答ありがとうございます。 まだまだ勉強不足ですので大変分かりやすくて助かりました。
guest

0

Java

1public class Test { 2 public static void main(String[] args) { 3 4 int [] n = {1, 2, 3}; 5 clear(n); 6 System.out.print(n[0] + "," + n[1] + "," + n[2]); 7 8 String[] strArr = {"","",""}; 9 10 changeArr(strArr); 11 System.out.println(""); 12 System.out.print(strArr[0] + "," + strArr[1] + "," + strArr[2]); 13 14 String str = "a"; 15 16 change(str); 17 System.out.println(""); 18 System.out.print(str); 19 } 20 public static void change(String str) { 21 str = "b"; 22 } 23 24 public static void changeArr(String[] strArr) { 25 strArr[0] = "a"; 26 strArr[1] = "b"; 27 strArr[2] = "c"; 28 } 29 public static void clear(int [] a){ 30 a[0] = 0; 31 a[1] = 0; 32 a[2] = 0; 33 } 34}

ちょいっと応用してみます。
String型の配列を渡す時の動作とString型を渡す時の動作です。

これを見ると、changeArrメソッドを通っている方は値が変わって
changeメソッドを通ってる方は値が変わりません。

これは、別にchangeArrが何か値を返してるからじゃないんです。
returnで返してるからじゃあないというわけです。
配列と参照型を引数で渡す時の挙動が違うから起きる混乱です。

投稿2015/09/08 03:25

編集2015/09/08 03:27
anonymouskawa

総合スコア856

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kimura

2015/09/08 09:53

参照型の基礎勉強もやっていきたいと思いました。 勉強させていただきありがとうございました。
guest

0

こんにちは。

今まで上記のclearメソッドの場合は、a[0]~a[2]が整数で返すので戻り値がintになると思ってました。

voidで書いてあるのはmeinメソッドがintだからですか?

メソッドの定義がまだ理解できていないのかなと思います。

javaのメソッドの定義は

修飾子 戻り値 メソッド名(引数){
}

になります。なので↓のメソッドは

public static void clear(int [] a){

修飾子 : public static
戻り値 : void(なし)
メソッド名: clear
引数 : int[]型

なので、引数は int ではなく int[] (intの配列)なのです。
(int[]は 配列の1つ1つの要素が int になっている集合体です。)

そして、戻り値はありません。
ちなみにreturn;は記載しなくてもいいものです。

mainメソッドでこのclearメソッドをint[]型 の変数 n を渡して呼び出し、
clearメソッド内で、引数で渡された int[]型の配列の要素を書き換えているのです。

投稿2015/09/08 02:26

編集2015/09/08 02:28
kaputaros

総合スコア1844

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kimura

2015/09/08 03:04

回答しえいただきありがとうございます []の中を代入して、メインメソッドに返すのは戻り値にならないってことですか? まだまだ勉強不足ですいません
kaputaros

2015/09/08 04:33 編集

戻り値はあくまで、returnした値のことを指します。 clearメソッドの戻り値の型はvoidなので、何もreturnしてないのです。 もちろんvoidがbooleanとかStringとかの値の場合は、それをreturn~;で返さないとならないです。 (ここはお分かりだと思います。) この例文は「参照渡し」といって、たとえば、 mainメソッドの中にあるint[]の箱を、clearメソッドの引数に渡すことでclearメソッド内でも同じ箱を見る・編集することができる ・・・ってなことを説明してる例です。
kimura

2015/09/08 09:55

参照渡し・・・大変勉強になりました。 分からないことだらけなので回答していただけて本当に助かります。 ありがとうございました。
guest

0

ベストアンサー

voidは戻り値なしです.早い話が,「そのメソッドの作業をするだけ」です.
戻り値があるものは,そのメソッドを呼び出した位置にその値が返ります.
この例で行くと,渡されたint型配列の0番~2番に0を代入するだけで,結果の値などを返すわけではありません.
「戻り値があるメソッド」というのは,次のmethod()メソッドのようなものです.

java

1public class test { 2 public static void main(String[] args){ 3 System.out.print(method()); 4 } 5 6 public static int method(){ 7 return 1; 8 } 9}

ここでは単純に1という値を返すメソッドを用意し,その結果を出力するだけのコードです.
mainの中でmethod()が呼び出され,method()は1を返します.
つまり,このタイミングでSystem.out.print(method())は,System.out.print(1)と解釈されます.
実際のメソッドでは何らかの処理を行わせ,その結果として出力したい数値を返すことになります.

貴方が勘違いしている点がわかりました.
結論から言うと,配列は"参照"なので,値を返す必要がありません.
今mainの中で作られた配列nがあります.
この"n"は,配列そのものを持っているのではなく,「配列が置かれているメモリ上の場所」を持っています.これがいわゆる"参照"です.この「場所」を通して,[]の中のインデックスによって値にアクセスしています.
そしてclearメソッドにはその「配列の場所」が渡されています.
clearメソッドから配列の各値に0を代入する際,mainで作成した配列と同じ場所を見ています.
なので,その後mainのnから配列を見ると,clearによって変更されたあとの値を見ることができるのです.
参照先の配列の中身を書き換えているので,値を返す必要がないのです.
あえて言うならint[]で返して,clearメソッドの中でreturn aなのですが,結局「同じ場所」をそのまま返しているだけなのであまり意味はありません.

投稿2015/09/08 02:08

編集2015/09/08 04:19
swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kimura

2015/09/08 03:01

例までありがとうございます。 例の場合は1を返すのは納得してます。 その場合と一緒で0を再代入して、その値(0を)をメインメソッドに返すことなので戻り値がintになるように思ってます。 まだまだ分かりませんが少しずつ勉強していきます。 ありがとうございました
kimura

2015/09/08 09:51

納得しました。 勉強になりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問