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

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

ただいまの
回答率

88.03%

java 戻り値について

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 1,256

score 59

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だからですか?

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

申し訳ありませんがご教授お願い致します。
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

0

voidは戻り値なしです.早い話が,「そのメソッドの作業をするだけ」です.
戻り値があるものは,そのメソッドを呼び出した位置にその値が返ります.
この例で行くと,渡されたint型配列の0番~2番に0を代入するだけで,結果の値などを返すわけではありません.
「戻り値があるメソッド」というのは,次のmethod()メソッドのようなものです.
public class test { 
    public static void main(String[] args){ 
        System.out.print(method()); 
    } 
     
    public static int method(){ 
        return 1; 
    } 
} 
ここでは単純に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 12:01

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

    キャンセル

  • 2015/09/08 18:51

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

    キャンセル

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 12:04

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

    キャンセル

  • 2015/09/08 13:31 編集

    戻り値はあくまで、returnした値のことを指します。
    clearメソッドの戻り値の型はvoidなので、何もreturnしてないのです。
    もちろんvoidがbooleanとかStringとかの値の場合は、それをreturn~;で返さないとならないです。
    (ここはお分かりだと思います。)

    この例文は「参照渡し」といって、たとえば、
    mainメソッドの中にあるint[]の箱を、clearメソッドの引数に渡すことでclearメソッド内でも同じ箱を見る・編集することができる
    ・・・ってなことを説明してる例です。

    キャンセル

  • 2015/09/08 18:55

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

    キャンセル

0

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]);
        
        String[] strArr = {"","",""};
        
        changeArr(strArr);
        System.out.println("");
        System.out.print(strArr[0] + "," + strArr[1] + "," + strArr[2]);
        
        String str = "a";
        
        change(str);
        System.out.println("");
        System.out.print(str);
    }  
    public static void change(String str) {
        str = "b";
    }
    
    public static void changeArr(String[] strArr) {
        strArr[0] = "a";
        strArr[1] = "b";
        strArr[2] = "c";
    }
    public static void clear(int [] a){  
        a[0] = 0;  
        a[1] = 0;  
        a[2] = 0;  
    } 
} 

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/09/08 18:53

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

    キャンセル

0

関数のイメージってこんな感じですが…
関数名()
{
    処理したい作業;
          :
    return 作業結果;
}

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

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


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

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

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

実際には引数にも型があるので、整数の足し算で考えると以下のようになります。
public static int calcAdd( int a, int b )
{
    return a+b;
}
こんな感じで結果が必要な場合に、returnを使います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/09/08 18:52

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

    キャンセル

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

  • ただいまの回答率 88.03%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る