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ページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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
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総合スコア856
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
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総合スコア1844
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/09/08 03:04
2015/09/08 04:33 編集
2015/09/08 09:55
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総合スコア20651
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/09/08 09:52